java中为什么int类型的-129转换成byte类型的会变成127
int类型一般是4个字节,一个字节有8位,这样int型数据二进制的完整形式有32位,而byte表示一个字节,于是byte类型数据二进制的完整形式有8位。
二进制数据在计算机内是以二进制存储的,要注意一点,计算机在存储某个数据时,是存储的数据的补码,说明一下补码与原码关系,正数补码与原码相同,负数补码是原码减1后取反。
根据上面阐述,129的原码是00000000 00000000 00000000 10000001 ,负数最高位取1,那么-129便是10000000 00000000 00000000 10000001 ,补码计算:取反为11111111 11111111 11111111 01111110(最高位是符号位,不参与取反),加1为11111111 11111111 11111111 01111111 ,现在转换为byte,只有8位,于是只能保留低8位,前面24位丢去,得到01111111,符号位为0,代表正数,原码、反码、补码一致。原码也是01111111。这就对应着十进制的127.
int类型的129转换成byte类型的会变成-127
129为正数,原码补码反码相同:00000000 00000000 00000000 10000001 现在转换为byte,只有8位,于是只能保留低8位,前面24位丢去,得到10000001,
补码为10000001, 开头为1 为负数 反码与补码不一样 为补码减1 得到反码:10000000 负数反码转成原码 符号位不变,其他位取反 得到原码:11111111 为 -127
int类型的128转换成byte类型的会变成-128
128为正数,原码补码反码相同:00000000 00000000 00000000 10000000 现在转换为byte,只有8位,于是只能保留低8位,前面24位丢去,得到10000000, 因为补码为10000000,所以为-128
在规定中,8位二进制码能表示的反码范围是-127~127。 -128没有反码。 那么,为什么规定-128没有反码呢?下面解释。 首先看-0,[-0]原码=1000 000,其中1是符号位,根据反码规定,算出[-0]反码=1111 1111, 再看-128,[-128]原码=1000 000,假如让-128也有反码,根据反码规定,则[-128]反码=1111 1111, 你会发现,-128的反码和-0的反码相同,所以为了避免面混淆,有了-0,便不能有-128,这是反码规则决定的。
-128的原码是10000000。 补码是反码+1:依然是10000000。(因为加1进位了,但是只有8位,所以进位无法显示)。