栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java语言:简述“原码”“反码”“补码”

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java语言:简述“原码”“反码”“补码”

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的问题,即: 

十进制数字原码反码补码
+00000 00000000 00000000 0000
-01000 00001111 11110000 0000
-11000 00011111 11101111 1111
......n=~n=~n+1
-1271111 11111000 00001000 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。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1032723.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号