C语言: C的char类型溢出问题

一.程序片段

int main()
{
  char a = 200;
  char b = 100;
  char c = 0;
  c = a + b;
  printf(“%d %d”, a+b,c);
  return 0;
}

运行结果:

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 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值