int x = 250;
byte y=(byte)x;
-6
为什么强制转换会得出错误结果?因为-56是降低精度后的补码转换来的十进制数字,这个数字的由来就是因为下面的 “原码” “反码 ”“补码”运算逻辑得到的。
原码:十进制数值的二进制转换结果,
byte就是1字节8bit的类型,原码中最大最小为0111 1111,1111 1111;——127~ -127;
其中第八位表示为正负,0为负1为正。
在计算中0000 0001 进行+1运算为0000 0010,也就是1+1=2;
但是负数进行+1运算中结果却与正常结果相反如:
1000 0010 +1 结果却是: 1000 0010 ——“-3”正常来讲 -2+1=-1才是正确结果,但是结果却大不相同,于是为了解决这个问题就使用了“反码”
反码:解决原码不能计算负数的问题
即符号位不变数值取反,1变成0,0变成1,符号位是不变的,如1000 0010 的反码就是1111 1101,进行+1后变成——1111 1110,将这个结果转换为原码就是——1000 0001 结果就是-1,这样计算的结果就变成了 -2+1=-1,由原码计算的“-3”变成了正常的计算结果“-1”。
但是:1000 0001 的补码是1111 1110,“+1”后变成1111 1111 ,换算成原码转换成十进制就是“-0”;但是由1111 1111 “+1”结果 0000 0000 也是“0”,这样就存在了两个0的问题。。为了解决这个问题就提到了“补码”。
补码:解决反码中正负0的存在
补码即所有反码中的负数都进行“+1”,这样就错开解决两个0的问题,即:
| 十进制数字 | 原码 | 反码 | 补码 |
|---|---|---|---|
| +0 | 0000 0000 | 0000 0000 | 0000 0000 |
| -0 | 1000 0000 | 1111 1111 | 0000 0000 |
| -1 | 1000 0001 | 1111 1110 | 1111 1111 |
| ...... | n | =~n | =~n+1 |
| -127 | 1111 1111 | 1000 0000 | 1000 0001 |
这样就可以完美解决这个问题,变成了一个0,但是这样原码取值范围本来是 127~ -127;这样1000 0000 就空出了,即“-128”,于是就将”-128“加进范围中变成“127~-128“的取值范围。
最后:
开头的int类型强制转换byte类型的计算就是两位数的运算,int类型是4字节的大小,x的值就是:0000 0000 0000 0000 0000 0000 1111 1010,十进制的数值就是”250“,但是强制转换为byte类型后由4字节变成了1字节精度损失就变成了1111 1010,计算机按照补码格式运算转换,可以运算试下,将1111 1010变成反码就是:1111 1001 转换为原码1000 0110——这个转换后的数值就是”-6“;所以强制转换后的结果就是-6;而不是250。



