C语言中abs()函数返回负数

1 c absolute

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

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

结果是:

-2147483648
Run Code Online (Sandbox Code Playgroud)

为什么会出现这种情况呢?我知道这个数字是max_int+1,但我不明白它的内部逻辑。

alv*_*los 5

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

您向绝对值函数传递一个有符号 int 数字,它返回一个数字,然后将其解释为 int 的有符号长数字。如果您将该 long 设为 unsigned long,并使用labs代替abs,结果将为正。

所发生的情况是由于强制转换 int 的有符号解释而导致整数溢出,该解释返回 int 的有符号解释,然后将其强制转换为 long。