首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数abs()返回C语言中的负数

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

Stack Overflow用户
提问于 2014-03-28 06:08:50
回答 3查看 4.6K关注 0票数 1

我用我的程序做了一些测试,我发现abs函数返回一个带有特定值的负值。你可以用这个程序自己检查:

代码语言:javascript
复制
#include <stdlib.h>
#include <stdio.h>
int main(){
    long number = abs(2147483648);
    printf("%ld",number);
}

结果是:

代码语言:javascript
复制
-2147483648

为什么会发生这种情况?我知道这个数字是max_int+1,但我不明白其中的内在逻辑。

EN

回答 3

Stack Overflow用户

发布于 2014-03-28 06:13:47

回想一下,绝对值函数返回一个数字的大小。还要回想一下,有符号数的整数表示是用2的补码表示法表示的,其中GSB (最高有效位)是有符号数字,将这种解释的正整数范围减半。

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

发生的是一个整数溢出,它从一个整数的有符号解释中返回一个有符号的整数解释,然后将其转换为一个长整型。

票数 5
EN

Stack Overflow用户

发布于 2014-03-28 06:14:12

在您的系统上,2147483648文本不适合int,因此它的类型为long或long long。将文本传递给abs函数时,参数将转换为int,转换结果为INT_MIN。abs(INT_MIN)在int中不可表示(-INT_MIN是二进制补码系统中的整数溢出),并调用未定义的行为(abs规范规定,如果结果不能表示,则行为是未定义的)。

票数 2
EN

Stack Overflow用户

发布于 2014-03-28 06:12:35

abs需要int。您传递的数字超出了int的范围,这会导致整数溢出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22700260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档