由于长度溢出引出的关于byte127+1=-128的一些思考

以下内容纯属小学员根据部分文章解释进行的推论,没有完全查证,如有差错还请各位大佬指出以助在学的小学员解惑。

byte的范围是(-128-127)


为什么负数范围比正数范围大?

为什么127+1 = -128?


在机器中int是8位二进制表示,即0000 0000。
其中正数表示为:0xxx xxxx。
       负数表示为:1xxx xxxx。

将数学理论的二进制码称为真值。
原码就是带上正(0)负(1)值的真值。
其中正数的原码反码补码相同不变,正数的最大值是01111111也就是64+32+16+8+4+2+1=127。
负数-1的真值是-0000001
则原码为10000001。
负数的反码为原码保留符号位,其余位按位取反,即11111110。
负数的补码为反码+1即11111111。计算机存储负数时存储的就是补码,并不是真码,。

为什么会这样设计?计算机分辨正负值已经很复杂了,为了构建更简单高效的计算机系统,开发人员创建了原码反码转换机制。
把减去一个正数变成了加上一个负数。

1-1 = 1+(-1) = 0000 0001(反) + 1111 1110(反) = 1111 1111(反) = 1000 0000(原) = -0

2-1 = 2+(-1) = 0000 0010(反) + 1111 1110(反) = 0000 0000 (反)        

3-2 = 3+(-2) = 0000 0011(反) + 1111 1101(反) = 0000 0000(反)

3-1 = 3+(-1) = 0000 0011(反) + 1111 1110(反) = 0000 0001(反)

2-3 = 2+(-3) = 0000 0010(反) + 1111 1100(反) =1111 1110(反) = 1000 0001(原) =-1


分析上述计算发现,这导致了结果为正数时结果缩小了1,0变成了-0.
为了消除这种情况创建出了补码。

对负数的反码加一,如果计算结果为正数,就不改变结果,如果计算结果为负数,转换为原码时就对结果减一。

1-1 = 1+(-1) = 0000 0001(补) + 1111 1111(补) = 0000 0000(补) = 0。

2-1 = 2+(-1) = 0000 0010(补) + 1111 1111(补) = 0000 0001 (补)        

3-2 = 3+(-2) = 0000 0011(补) + 1111 1110(补) = 0000 0001(补)

3-1 = 3+(-1) = 0000 0011(补) + 1111 1111(补) = 0000 0010(补)

2-3 = 2+(-3) = 0000 0010(补) + 1111 1101(补) =1111 1111(补) = 1000 0001(原) =-1

于是-127在计算机中存储就变成了1000 0001(补)

-127 - 1 = 1000 0001(补) + 1111 1111(补) = 1000 0000(补)= 0111 1111(反) =<del>(1000 0000)</del> 1000 0000(原) 

在计算机中已经有0000 0000作为0了,将1000 0000也作为0没什么用还浪费1个范围,0处于正数范围内,相当于正数有128个,于是1000 0000 作为-128出道。

正数补码最大值01111111=127
当计算127+1时
01111111(补)进1,变为10000000(补)=01111111(反)=10000000(原)=-128

所以出现了整数最大值+1结果等于整数最小值的事件。
 

参考信息关于byte类型127+1为什么是(-128)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值