12-03-2020, 08:45 AM
这个未定义行为不在于“有符号数转无符号数”,C的<stdlib.h>中定义的abs()函数的原型是int abs(int);,返回值仍为int而非unsigned。
发生未定义行为的原因在于abs(INT_MIN)的返回值不能由它的类型(int)表示。另外cppreference以及大多数C语言教材(受谭浩强误导)有误,假设int为32位,则INT_MIN应该是-2147483647-1,而不是-2147483648,因为后者不是int类型的表达式,它是由2147483648这个整数字面量加上一元负号构成的一元表达式,而2147483648不是int类型的整数字面量,它是long long类型。
参见键盘农夫著《狂人C》,国内非常难得的一本“不谭”的C语言教材。
发生未定义行为的原因在于abs(INT_MIN)的返回值不能由它的类型(int)表示。另外cppreference以及大多数C语言教材(受谭浩强误导)有误,假设int为32位,则INT_MIN应该是-2147483647-1,而不是-2147483648,因为后者不是int类型的表达式,它是由2147483648这个整数字面量加上一元负号构成的一元表达式,而2147483648不是int类型的整数字面量,它是long long类型。
参见键盘农夫著《狂人C》,国内非常难得的一本“不谭”的C语言教材。