我正在对我的程序进行一些测试,我发现abs函数返回一个具有特定值的负值。您可以使用此程序自行检查:
#include <stdlib.h>
#include <stdio.h>
int main(){
long number = abs(2147483648);
printf("%ld",number);
}
结果是:
-2147483648
为什么会这样?我知道这个数字是max_int + 1,但我不明白这个内部逻辑。
答案 0 :(得分:3)
回想一下,绝对值函数返回一个数字的大小。还记得带符号数字的整数表示以二进制补码表示法完成,其中GSB(最高有效位)是有符号数字,将该解释的正整数范围减半。
您正在向绝对值函数传递一个带符号的int数,它返回一个数字,然后将该数字解释为int中的有符号长数。如果您将该长度设为无符号长度,并使用labs
而不是abs
,结果将是正数。
发生了一个整数溢出,它来自对int的带符号解释,它返回一个int的带符号解释,然后将其转换为long。
答案 1 :(得分:2)
在您的系统上2147483648
字面值不适合int
,因此其类型为long
或long long
。当文字传递给abs
函数时,参数将转换为int
,转换结果为INT_MIN
。 abs(INT_MIN)
int
中无法表示-INT_MIN
(abs
是两个补码系统中的整数溢出)并调用未定义的行为({{1}}规范说如果结果不能表示,行为未定义。)
答案 2 :(得分:0)
abs
期待int
。您传递的数字超出int
范围,导致整数溢出。