https://blog.csdn.net/xmc281141947/article/details/74740061
& 0xFF
计算机内的存储都是利用二进制的补码进行存储的。
比如我们int=-127 赋值给byte[0]时候 存储的其是其补码10000001(8位)。
当我们把这个byte[0]输出的时候JVM做了一个补位1111111111111111111111111 10000001(32位)很显然这两个补码表示的十进制数字依然是相同的。
-127的原码是前24位为0|11111111 反码是前24位为1|10000000 补码则是前24位为1|10000001
二进制的最高位是符号位(有符号数成立 无符号数不成立)
- 但是我们有时候要的不是十进制相等,而是只需要补码相等,可以看到这个时候byte转换为int的时候 其高位 已经被补位1了,这个时候我们&0XFF 其本质原因就是想保持二进制补码的一致性。
0XFF是16进制 其十进制是255 二进制则是 11111111
所以涉及到左移右移 其实移动的是补码,对于正数来说 原码,反码,补码都一样(这是规定),对于负数则不一样(符号位不动,反码则是数值取反,补码则是+1)
左移位:<<,有符号的移位操作 左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用0补充
右移位:>>,有符号的移位操作 右移操作是将运算数的二进制码整体右移指定位数,右移之后的空位用符号位补充,如果是正数用0补充,负数用1补充。
加法计算公式为:两个数的补码相加,如果是正,则直接输出,如果是负,则除符号位以外取反加一