java中位运算符,(byte) 0x80 的那个,为何答案是-32

如题所述

0x80 表示 128,(0x 代表 16 进制,8 * 16¹ + 0 * 16º = 128),128 的二进制是 10000000,即 2 的 7 次方。
byte 共有 8 位,表示范围是 -128 ~ 127,二进制即 10000000 ~ 01111111,第一位为符号位,1 表示负数,0 表示整数,11111111 即表示 -127,10000000 比较特殊,表示 -128。所以,0x80 本来是整数的 128,二进制 00000000000000000000000010000000 (Java 中整数4个字节32位)。(byte)0x80,将其转换为 byte,即截取最后 8 位,即 10000000,就是 byte 中的 -128。
>> 表示右移操作,右移一位表示除以 2。(byte)0x80 >> 2,表示将(byte)0x80右移两位,那么就是 -128 ÷ 2 ÷ 2 = -32。追问

向右移位是不是都除以2

追答

比如 00001100(就是 12),右移两位,就变成了 00000011(3),相当于 12 ÷ 2 ÷ 2。
如果是负数,负数右移符号位不变,比如 10001100(-12),右移两位则变成了 10000011,(-3),相当于 -12 ÷ 2 ÷ 2。
上面只是比较浅显地从数值原生的二进制表示(原码)角度的讲解,如果想深入了解,可以查看关于原码、反码和补码的知识,以及数值在计算机中的存储方式。

追问

那31呢,向右也是除以2,就不对了吧

追答

31就是 0011111,向右移一位就是 00001111,就成了 15。31÷2=15.5,但是我们是要保存在 byte 里的,所去将小数位去掉,留下就是15。

追问

要是int?

追答

int 也是整数,int a = 31 / 2,那么 a = 15.
float 和 double 则是用来保存小数的.

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-11-01
byte 0x80
原码: 1000_0000
反码: 1111_1111
补码: 1000_0000

byte 0x80 >> 2

补码: 0010_0000
反码: 1101_1111
原码: 1010_0000 -32追问

默认是负的?