如果要自己实现一个获取绝对值的函数,应该都没有问题,我这边也自己写了一个:
void myabs(int i){if(i>=0){printf("%d\n",i);}else{printf("%d\n",-i);}
}
但是,这个函数真的没有问题吗?如果i的值为-2147483648,会怎样,我们来试下:
#include <stdio.h>void myabs(int i){if(i>=0){printf("%d\n",i);}else{printf("%d\n",-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型变量中了。