我用我的程序做了一些测试,我发现abs函数返回一个带有特定值的负值。你可以用这个程序自己检查:
#include <stdlib.h>
#include <stdio.h>
int main(){
long number = abs(2147483648);
printf("%ld",number);
}结果是:
-2147483648为什么会发生这种情况?我知道这个数字是max_int+1,但我不明白其中的内在逻辑。
发布于 2014-03-28 06:13:47
回想一下,绝对值函数返回一个数字的大小。还要回想一下,有符号数的整数表示是用2的补码表示法表示的,其中GSB (最高有效位)是有符号数字,将这种解释的正整数范围减半。
您正在向绝对值函数传递一个带符号的int number,它将返回一个数字,然后将该数字解释为int中的有符号长数。如果将该长度设为无符号的长整型,并使用labs而不是abs,结果将是肯定的。
发生的是一个整数溢出,它从一个整数的有符号解释中返回一个有符号的整数解释,然后将其转换为一个长整型。
发布于 2014-03-28 06:14:12
在您的系统上,2147483648文本不适合int,因此它的类型为long或long long。将文本传递给abs函数时,参数将转换为int,转换结果为INT_MIN。abs(INT_MIN)在int中不可表示(-INT_MIN是二进制补码系统中的整数溢出),并调用未定义的行为(abs规范规定,如果结果不能表示,则行为是未定义的)。
发布于 2014-03-28 06:12:35
abs需要int。您传递的数字超出了int的范围,这会导致整数溢出。
https://stackoverflow.com/questions/22700260
复制相似问题