关于char的溢出问题

现在看下面的问题

int main()
{
    char number = 129; 
    printf(“number=%d\n”, number);
    return 0;
}

结果为什么是-127?

int main()
{
    char number = -129; 
    printf(“number=%d\n”, number);
    return 0;
}

结果为什么是127?

解析:首先要知道三点
第一点:大家知道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 number = 129时,赋值给number后,number代表的存储空间中存储的是1000 0001,但取出来的时候,因符号位是1,系统认为他是一个负数的补码,1000 0001其实就是-127的补码,故第一个输出的是-127;

char number = -129时,number代表的存储空间是0111 1111,因为,-129的原码是1 1000 0001,反码是1 0111 1110 ,补码是1 0111 1111.系统读低8位,也就是0111 1111,认为是一个正数,而0111 1111是127的补码,故输出127.

总述:可以这么理解:跟时钟的原理一样,绕圈圈,129时溢出了,比127多了2,则绕回2个,到了-127;num等于-129时,比-128少1,则绕回了127.

  • 24
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值