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就没啥问题

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

时间: 2024-10-19 06:45:24

INT_MIN与溢出的相关文章

INT_MAX (2147483647) 和INT_MIN (-2147483648)溢出

c语言中32位int型数据在运算的时候可能会出现溢出的情况,如: -2147483648-1会得到什么结果? -2147483648乘(-1)会得到什么结果? 2147483647+1会得到什么结果? 在编译器中运行一下得到的结果分别是: -2147483648-1=2147483647: -2147483648乘(-1)=2147483647 2147483647+1=-2147483648 下面解释出现这几个情况的原因: ①-2147483648的二进制表示为1000 0000 0000 0

位操作的技巧

一,基本概念认知 1,为啥要用补码 计算机中的符号数有三种表示方法,即原码.反码和补码.三种表示方法均有符号位和数值位两部分,符号位都是用0表示"正",用1表示"负",而数值位,三种表示方法各不相同. 在计算机系统中,数值一律用补码来表示和存储.原因在于,使用补码,可以将符号位和数值域统一处理:同时,加法和减法也可以统一处理.此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路.(来自百度百科) 2,补码的求法: 正数的补码和原码相同: 负数是对应正数

LeetCode 008 String to Integer (atoi)

[题目] Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases. Notes: It is intended for this problem to b

atoi()函数的应用

题目:编写程序实现字符串到整数的转换,如输入字符串"12345",输出整数12345:即实现              atoi(): 实现注意事项:此题考查的是考虑问题的全面性,在实现atoi()函数时应注意以下五点: (1)指针为NULL; (2)空字符串  '\0'; (3)+.- 号的处理; (4)溢出问题; (5)遇到异常字符怎么办; #include <stdio.h> #include <assert.h> #include <ctype.h

编写优质嵌入式C程序(转)

前言:这是一年前我为公司内部写的一个文档,旨在向年轻的嵌入式软件工程师们介绍如何在裸机环境下编写优质嵌入式C程序.感觉是有一定的参考价值,所以拿出来分享,抛砖引玉. 转载请注明出处:http://blog.csdn.net/zhzht19861011/article/details/45508029 摘要:本文首先分析了C语言的陷阱和缺陷,对容易犯错的地方进行归纳整理:分析了编译器语义检查的不足之处并给出防范措施,以Keil MDK编译器为例,介绍了该编译器的特性.对未定义行为的处理以及一些高级

LeetCode(Easy)--C++笔记

前言:这是关于LeetCode上面练习题C++的笔记,有些地方参考有网友的解题方法(可能有些参考没能注明,望谅解),如有需要改进的地方希望留言指教,多谢! 目录: ZigZag Conversion Reverse digits of an integer Implement atoi to convert a string to an integer Determine whether an integer is a palindrome Write a function to find th

你会写“atoi”吗???

分析: 1.如果输入的字符包含不是数字字符的字符??? 例如:"123adc4". 针对这种情况,我们只要加上判断就行了,只要遇到不是数字字符的直接返回. 2.如果在数字字符前面有正负号又该怎么办??? 例如:"-123"."+123". 针对这种情况,我们再加上判断,判断字符串的第一个字符是不是正负号,并用一个标记位flag记录正负. 3.当输入的字符串前面几个字符都是空格又该怎么办??? 例:"   -123","

整型数的溢出

#include <stdio.h> #include <limits.h> int main() { printf("INT_MAX+1=%d\n",INT_MAX+1); printf("INT_MAX+INT_MAX=%d\n",INT_MAX+INT_MAX); printf("INT_MIN=%d\n",INT_MIN); printf("INT_MIN-1=%d\n",INT_MIN-1);

学C第4天上(溢出、随机数)

一.溢出 1.short类型 数据使用必须在范围内,否则无符号产生溢出,有符号出错. 1      print("short极大值%d","short极小值",SHRT_MAX,SHRT_MIN);//32767,-32767  2      print("unsigned short极大值%d","unsigned short极小值",USHRT_MAX,0);//65535,0  3   4      unsigned s