[编译,报错以及其他] 有关C/C++中int不能用-2147483648当最小值的问题

这个取决于今早看耗子叔的微博:

image

这里说到了int的取值范围的问题,int的取值是-2147483648 ~ 2147483647,但是如果直接在编译器(VS2013)中使用-2147483648会报错:

error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型

编译器(VS2013)在看到-2147483648时,会先做一个判断,就是先做一个2147483648 > INT_MAX ?的判断,判断为真后会认为int装不下于是调用unsigned int来装,但是unsigned int在准备赋值时会先将它取反,再去赋值。所以这个过程在编译器来看是这样的:

unsigned int tmp = 2147483648;

tmp = –tmp

int n = tmp

 

这也是耗子叔说的那句为什么这个数是一个表达式的原因。这个过程在别的数上没有问题,但是遇到+2147483648就不行,因为+2147483648在高位到第一个1上取反时还是他本身【自行查二进制表示】,所以在这里变成了n = 2147483648,这个显然会溢出,所以有了那个error。

我们真的要使用这个这个值,要做一下特殊处理:

#define INT_MIN	(-2147483647 - 1) 

 

这样就正常了,就是一个类型的自动转换的知识。

然后后来耗子叔自己转发了一个链接,那里讲的也比较清楚,链接如下:

http://www.hardtoc.com/archives/119

posted @ 2014-11-18 16:38  Tiny-Box  阅读(858)  评论(1编辑  收藏  举报