INT_MIN与溢出
2017-07-27 19:36
190 查看
隔了好久没更新了,由于我在学习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就没啥问题
额,发现基础知识都遗忘了。
挺好奇这方面的,由于没有学过相关的课程。所以学起来有点吃力,进展缓慢。所以导致没啥可写的。
今天看到这么一段话:
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和INT_MAX溢出问题
- INT_MIN和INT_MAX溢出问题
- INT_MIN和INT_MAX溢出问题
- INT_MIN和INT_MAX溢出问题
- INT_MIN与溢出
- INT_MIN与溢出
- 将 expression 转换为数据类型 int 时发生算术溢出
- 【climit】INT_MIN & INT_MAX
- 进制转换 HDU 2031 注意-2147483648变为正数后用int存会溢出
- int类型赋值INT_MIN(-2147483648)
- INT_MAX,INT_MIN,isdigit函数
- 【提问】有关short和int溢出的一个有趣测试
- INT_MIN和INT_MAX
- 70. Climbing Stairs---组合C(m,n)的使用,注意int溢出!
- 判断Int类型数据是否溢出
- 关于sum(int)报错:将expression转化为数据类型int时发生算术溢出错误
- MSSQL sum()计算expression转化为数据类型int时发生算术溢出错误解决
- 使用检查数据(int,double,float等)溢出,并抛出异常
- 关于C++ int中溢出显示错误的底层原理
- Max-Min-搜索int类型数字文件中的最大数和最小数写到屏幕