为什么(byte)128的输出为-128?

注:十进制二进制的转换不会的去百度吧,在这里就不介绍了,也可以参阅计算机组成原理或数字电路基础的相关书籍.
A.要想解决这个问题首先我们明确以下几个概念
1. 在JAVA中整数的数据类型有4种分别是
byte-8bit(位) short-16bit int-32bit long-64bit
2. 8bit=1字节所以
byte-1字节 short-2字节 int-4字节 long-8字节
3.byte的取值范围为 -128~127(不理解的百度)
4. 我们明确一下”二进制”中原码、反码、补码的概念
我们拿十进制中的“1”来举例
对于十进制“1”(正数)来说
其原码(八位)=00000001
其反码(八位)=00000001
其补码(八位)=00000001
也就是说正数的 原码=反码=补码
对于十进制”-1“(负数)来说
其原码(八位)=10000001(规定最高符号位 “0”表示“+” “1”表示“-”)
其反码(八位)=111111110(相对于原码,其符号位不变,其他位按位取反,既 1变0 0变1)
其补码(八位)=111111111(即反码+1)
5.如果已知补码求原码,即对已知的补码再求补码即可(已知负数的补码求补码按照上面的方法求出即可)(已知正数的补码求补码,还是其本身,因为正数的原码=其补码,补码在推回去也是等于其本身的,也就是说不用变化)
即对”-1“的补码求补码为10000001 = “-1”的原码
6.“+0”的原码是00000000 “-0”的原码是10000000
“+”0的反码是00000000 “-0”的反码是11111111
“+0”和“-0”的补码均为00000000
实际上规定将“+0”和“-0”的原码统一为了 00000000 所以10000000也就未被使用,所以就将其分给了最小的负数去用.
所以!!!规定“-0”用来表示最小的负数,“+0”用来表示其本身!!!(这条是解决问题的关键务必记住)
7.计算机中为了方便计算,在计算机中数据的储存形式为其补码.
B.下面我们进入正题
1. int类型(32位)
所以128的原码为 00000000 00000000 00000000 10000000
在计算机中储存的是其补码(正数的补码=原码)即
00000000 00000000 00000000 10000000
byte类型(8位)
即截取高24位留取后8位即10000000
现在要将数据从计算机中打印出来即对“10000000”求原码在打印其真值(数据本身的值)(即对补码再求补码)
通过上面的知识我们可以得到其补码=10000000
(疑问:其补码不应该是 1 0000 0000吗?)
(答:在求补码的过程中不能影响符号位也就是符号位保持不变)
所以10000000其真值为“-0”也就是“-0”的原码为10000000.
刚才我们说“-0”用来表示最小的负数即8位中最小的负数为-128
所以我们说-128的补码为10000000
注:实在不理解的可以当成特殊值背下来
C.为了更好的理解我们在针对上溢和下溢分别举出一个例子
1.上溢以129为例
int类型(32位)
其原码为 00000000 00000000 00000000 10000001
在计算机中其以补码形式储存
所以其补码= 00000000 00000000 00000000 10000001 =原码=反码
byte类型(8位)
其补码= 10000001 =原码=反码
求其原码(即对补码再求补码)=11111111
其真值为-127
2.下溢以-129为例
int类型(32位)
其原码为 10000000 00000000 00000000 10000001
在计算机中其以补码形式储存
即其补码为 11111111 11111111 11111111 01111111
byte类型(8位)
其补码= 01111111
求其原码(正数原码=补码)=01111111
所以其真值为127

你可能感兴趣的:(JAVA)