想问问为什么输出的答案是-127而不是129

img

img

参考
浅谈Java中的补零扩展和补符号位扩展_136.la 今天,魏屌出了一道题,题目如下:定义一个大头序的byte[]a={-1,-2,-3,-4},转换成short[]b.问b[0]和b[1]分别是多少?乍一看,这题不难,无非就是移位操作,再进行组合。但是呢?对于用Java的童鞋来说,这里面有一个坑,稍不注意可能就踩进去了。在说之前,我先把代码和答案贴出来吧。看到这里,可能有的童鞋比较奇怪,为啥要&0xff,这不相当于没变化吗?非也,不信我举个 https://www.136.la/java/show-18859.html

byte的范围是-128 ~ 127 不能表示出 129
-127和+129的效果等价
在计算机中数值都是以二进制补码形式存储的,
byte类型只能存储8位二进制数,其中最高位是符号位,符号位为0是正数,符号位为1是负数。
符号位为0正数范围是
补码:0000 0000 表示0
补码:0000 0001 表示1
........
补码:0111 1110 表示126
补码:0111 1111 表示127
符号位为1负数范围是
补码:1000 0000 表示 -128
补码:1000 0001 表示 -127
........
补码:1111 1110 表示 -2
补码:1111 1111 表示 -1

127 的补码为 0111 1111 加2 就变成 1000 0001 最高位符号位变成1就是负数了,也就是 -127

如有帮助,望采纳!谢谢! 点击我这个回答右上方的【采纳】按钮

本来,byte类型的num5+2会自动向上转型 结果为129,但是他又吧这个结果强制向下转型为bate的值,baty类型的最大值为127,输出的结果自然会失真,具体怎么个失真法,前面哪位大佬解释的很清楚了