C语言看图说话之溢出现象(原码反码补码)

以下内容为自学笔记缺乏严谨性,如有错误和不足请大佬指正

(1)-1的二进制为什么全1?

要回答这个问题首先要明白 原码 反码 补码

负数在计算机中都是以二进制补码(Complement)形式表示和存储的

原码:        原码就是符号位加上的绝对值,即用第一位表示符号(正0负1),其余真值位表示值

-1的原码就如上图一样

反码:        正数的反码就是他本身,负数的反码是在原码的基础上,符号位不变,其余各个位取反

-1的反码就是符号位1不变其他位取反

补码:        正数的补码就是他本身,负数的补码是在原码的基础上,符号位不变,其余各个位取反最后+1(既在反码的基础上+1)

-1的补码就是在反码的基础上+1变成全1如上图

因为负数在计算机中都是以二进制补码(Complement)形式表示和存储的

所以-1在计算机表示和存储的的形式就是全1

(2)什么是整形溢出现象?

上面这种情况就是整形溢出现象

比如char只能存储8bit这8位全是1再加1就变成了前面一个1后面8个0(100000000),而char只能存储8位前面那个多出来的1就会溢出被舍弃

(3)为什么有符号整形最大值+1反而最小值?

有符号整形最大值一定是第一位是0其余为1

以char类型举例

最大值                     0111,1111

最大值+1                1000,0000

因为是有符号整形 符号位为1是负数,此时是他的补码

负数的原码就是补码的补码

补码的反码就是      1111,1111

正常来说他补码的补码应该是11000,0000舍弃最高位1为1000,0000 代表-0现在代表-128 因为没有-0这个数所以不冲突,不会影响计算。

但是可以求他的真值,就是将符号取出来后面的值+1也就是-(127+1) == -128 为char类型的最小值,求真值的方法其他的数也适用

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值