函数abs()在C中返回负数

时间:2014-03-27 22:08:50

标签: c absolute

我正在对我的程序进行一些测试,我发现abs函数返回一个具有特定值的负值。您可以使用此程序自行检查:

#include <stdlib.h>
#include <stdio.h>
int main(){
    long number = abs(2147483648);
    printf("%ld",number);
}

结果是:

-2147483648

为什么会这样?我知道这个数字是max_int + 1,但我不明白这个内部逻辑。

3 个答案:

答案 0 :(得分:3)

回想一下,绝对值函数返回一个数字的大小。还记得带符号数字的整数表示以二进制补码表示法完成,其中GSB(最高有效位)是有符号数字,将该解释的正整数范围减半。

您正在向绝对值函数传递一个带符号的int数,它返回一个数字,然后将该数字解释为int中的有符号长数。如果您将该长度设为无符号长度,并使用labs而不是abs,结果将是正数。

发生了一个整数溢出,它来自对int的带符号解释,它返回一个int的带符号解释,然后将其转换为long。

答案 1 :(得分:2)

在您的系统上2147483648字面值不适合int,因此其类型为longlong long。当文字传递给abs函数时,参数将转换为int,转换结果为INT_MINabs(INT_MIN) int中无法表示-INT_MINabs是两个补码系统中的整数溢出)并调用未定义的行为({{1}}规范说如果结果不能表示,行为未定义。

答案 2 :(得分:0)

abs期待int。您传递的数字超出int范围,导致整数溢出。