《c陷阱与缺陷》笔记--注意边界值

如果要自己实现一个获取绝对值的函数,应该都没有问题,我这边也自己写了一个:

void myabs(int i){
        if(i>=0){
                printf("%d
",i);
        }else{
                printf("%d
",-i);
        }
}


但是,这个函数真的没有问题吗?如果i的值为-2147483648,会怎样,我们来试下:

#include <stdio.h>

void myabs(int i){
        if(i>=0){
                printf("%d
",i);
        }else{
                printf("%d
",-i);
        }
}

int main(void){
        int a = -2147483648;
        myabs(a);
        return 0;
}


上面代码编译后出现如下warning:

unsigned.c: In function 'main':
unsigned.c:12:2: warning: this decimal constant is unsigned only in ISO C90 [enabled by default]

执行后的结果为:

-2147483648


额,怎么没有变成正数呢。因为32位系统int的范围为-2147483648 ~ 2147483647,负数比正数可容纳的值大了1,

所以-2147483648取反后就无法保存在int型变量中了。

原文地址:https://www.cnblogs.com/dyllove98/p/3149505.html