数值在计算机中以补码形式存储。
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。
机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1。
例:十进制中的数 +2 ,计算机字长为8位,转换成二进制就是[00000010]。如果是 -2 ,就是 [10000010] 。
- 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。
- 反码的表示方法是:正数的反码是其本身;负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。
- 补码的表示方法是:正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1。 (即在反码的基础上+1)
ps:加法:1+0=1,0+0=0,1+1 考虑进位,0111+1110=10101
十进制数 | 原码 | 反码 | 补码 |
---|---|---|---|
85 | 0101 0101 | 0101 0101 | 0101 0101 |
-85 | 1101 0101 | 1010 1010 | 1010 1011 |
9 | 0000 1001 | 0000 1001 | 0000 1001 |
-9 | 1000 1001 | 1111 0110 | 1111 0111 |
10 | 0000 1010 | 0000 1010 | 0000 1010 |
-10 | 1000 1010 | 1111 0101 | 1111 0110(注意+1时,进位) |
例: int 强转byte
int强制转换为byte型数据时,会产生一个-128~127的有符号字节
int a = 233;
byte b = (byte)a;
System.out.print(b);
//b = -23
解答:
计算机中数值都是以二进制补码的形式存储
二进制数值的第一位代表数值的符号(正数为0,负数为1)
其中正数的补码等于其原码
负数的补码等于其原码(除符号位)的反码+1
java中
int占32位
byte占8位
int 233=00000000 00000000 00000000 11101001
强转后去掉前面的24个0,得11101001
补码转换为原码的规则:对该补码再次求补码
ps:
符号位为0,代表正数,原码=反码=补码
符号位为-1,代表负数,原码=补码再次求补码(符号位为1,其余各位取反,然后再整个数加1。 )
接着判断首位是1,为负数,取补码得10010110+1=>-23