首页 > 代码库 > INT_MIN与溢出

INT_MIN与溢出

隔了好久没更新了,因为我在学习PL和编译器/解释器的知识。挺好奇这方面的,因为没有学过相关的课程,所以学起来有点吃力,进展缓慢,所以导致没啥可写的。

今天看到这么一段话:

32位的int型的取值是2147483647 到 -2147483648,但是,在C/C++语言中,你不能直接使用 -2147483648 来代替最小负数,因为它不是一个数,而是一个表达式。表达式是:“对正数2147483648取负”,所以,2147483648已经溢出了。这就是为什么INT_MIN总是定义成 (-INT_MAX - 1) 的原因。

之前没注意过这点,本着实践出真知的精神,我就在电脑上运行了下,发现结果是一样样的,用gcc开启Wall也没有任何警告。那么问题来了,究竟是什么情况呢?

后来一位前MSRA的员工告诉我:

这个其实要看标准的版本吧……如果是C8(和谐)9,decimal literal的类型推断顺序是long, unsigned long,所以-21474836(和谐)48的literal会解释成unsigned long,所以取负就跪了;而如果是C++ 11,那推断顺序是long, long long就没啥问题

额,发现基础知识都遗忘了。

INT_MIN与溢出