概述
以下内容纯属小学员根据部分文章解释进行的推论,没有完全查证,如有差错还请各位大佬指出以助在学的小学员解惑。
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的一些思考所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复