[C.C++] C语言: C的char类型溢出问题

538 0
Honkers 2025-3-22 03:36:12 来自手机 | 显示全部楼层 |阅读模式

一.程序片段

  1. int main()
  2. {
  3. char a = 200;
  4. char b = 100;
  5. char c = 0;
  6. c = a + b;
  7. printf(“%d %d”, a+b,c);
  8. return 0;
  9. }
复制代码

运行结果:

300

44


 二.解释溢出

char分配的是一字节有符号整数,范围通常是 -128 到 127。


如果char类型被赋值一个超出范围的数值300,char类型的储存就会发生溢出,根据有符号整数的溢出规则,当赋给有符号类型的变量一个超过其表示范围的值时,结果是未定义的。

而溢出的数据储存有一定规则转化为范围内的数据

三.转化规则

1.300储存在char类型时,我们可以先得到300的补码:

1 0010 1100

 因为char只能存储8bit会舍弃第九位数字,得到补码

0010 1100

整数的补码,反码,原码相同,所以就直接转化为44 

2. 428储存在char类型时,先得到428的补码

1 1010 1100

 舍弃超出8bit的字符:

1010 1100

整形提升,用符号位填充(32位)

1111 1111 1111 1111 1111 1111 1010 1100

首位元素会被当做符号位,1首元素会被当做负值,补码取反后+1,得到原码

1000 0000 0000 0000 0000 0101 0100 

则得到-84 

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Honkers

荣誉红客

关注
  • 4010
    主题
  • 36
    粉丝
  • 0
    关注
这家伙很懒,什么都没留下!

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行