打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
关于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.

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Java运算符基本类型强制转化原码补码
C语言数据类型有哪些?
数据在内存中的存储
Facebook 面试题|将数字转换为十六进制
(字符型变量你懂吗?)乐创DIY C语言讲义​——3.5节
Java基础语法(2)-变量
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服