我是靠谱客的博主 标致项链,最近开发中收集的这篇文章主要介绍由于长度溢出引出的关于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)

最后

以上就是标致项链为你收集整理的由于长度溢出引出的关于byte127+1=-128的一些思考的全部内容,希望文章能够帮你解决由于长度溢出引出的关于byte127+1=-128的一些思考所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部