首页 > 代码库 > 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与溢出
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。