当前位置: > 华清远见教育科技集团 > 嵌入式学习 > 讲师博文 > char类型溢出问题
char类型溢出问题
时间:2016-12-14作者:华清远见

大家之前肯定都遇到过这样的问题,假如我用char类型的变量num接收大于127的数时,打印num的值发现是-128

这是为什么呢?(此处只讨论整数)

第一点:大家知道char类型的取值范围是-128到127,这是char类型的存储空间限制的。char类型的变量占1个字节,高位为符号位,0代表整数,1代表负数。这样char类型大为(0111 1111)即127.存储范围不再它的取值范围的话会造成溢出。

第二点:数值数据在内存中是以数据的补码形式存放的,比如存放一个正整数127,由于正数的补码就是源码,所以存放在内存中即为0111 1111.而如果要存放一个负数-2,系统会首先得到该负数的补码(取绝对值后取反,再加1)即1111 1110,再保存存储起来。读取的时候执行相反操作。

第三点:char类型的变量在使用时系统会将其扩展为int类型,高24位补符号位。变量的正负通过扩展的24位决定,1代表负数,0代表整数。

跟据以上三点,
        我们可以分析char num = 128,系统是如何操作的:

128是一个正数,所以它的补码也是它本身1000 0000,赋值给num后,num代表的存储空间中存储的就是1000 0000.

我们再分析printf(“%d\n”, num);

使用num变量时系统首先会根据符号位将num扩展为32位,由于现在符号位为1,所以扩展后为1111 1111 1111 1111 1111 1111 1000 0000.系统认为这是一个负数的补码,所以再得到将其减1取反(这里操作的是低8位)得到1000 0000为128,通过扩展的24位,系统认为这是一个负数,所以终打印出来的结果是-128.

发表评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)