原码反码补码

原码反码补码原码反码补码 总结 编码规则 有符号数的编码规则 原码 最高位符号位 对其他的位进行本身绝对值即可 反码 正数 反码和原码相同 负数 符号位一定是 1 其余位对原码取反 补码 正数

大家好,我是讯享网,很高兴认识大家。

原码反码补码(总结)


编码规则
有符号数的编码规则

原码:最高位符号位,对其他的位进行本身绝对值即可。

反码:

  • 正数:反码和原码相同;
  • 负数:符号位一定是1,其余位对原码取反。

补码:

  • 正数:补码和原码相同;
  • 负数:符号位一定是1,反码+1。

测试(demo):针对(byte=8位)


1 -1 -7
原码 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1
反码 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 0 0
补码 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1

为什么计算机中数据要以补码的形式存储呢

因为计算机中只有加法没有减法.为了更加低成本的计算出结果,所以使用补码来存储数据.


讯享网

例如 3-2 = 3 + (-2) = 1
使用原码计算 使用反码计算 使用补码计算
3 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1
-2 1 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0
结果 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
正确 × ×

java中byte(1字节,8位)的取值范围-128<=取值范围<=127?

按照我们一般认为,如果8位中一位作为符号,那么应该是<=取值范围<=0,或者写成-127<=取值范围<=127,-128从何而来?

  • 化减为加:

由于计算中的CPU只有加法器,没有减法器,所以在计算机采用原码做减法是会存在这样的问题:
对于1-1=0 看做1+(-1)=0 二进制表示 0001+1001=1001 变成了十进制的负1而不是0。
补码的出现很好的解决了这个问题,由于采用补码运算,则补码加法成为:[X+Y]补 = [X]补 + [Y]补同时,补码的减法变为:[X-Y]补 = [X]补 - [Y]补 = [X]补 + [-Y]补 ;在此我们以减法为例说明补码的优势,还以上述为题为例:(0001)补+(1001)补 = 0001 + 1111 = 0000 (最高位的进位省略),这样就顺利得到了0

  • 与00000000都是零吗?——关于-128的由来

补码还解决了原码中存在两个0 的问题(即+0 和 -0),以8进制为例,java中byte的取值范围应该是-127~ -0和+0~ 127 即存在-0和+0 ,但是在两个0转换为补码后,分别为和00000000,00000000它还是0,但是我们人为地规定表示-128,这就是上面取值范围中-128的由来。这里再强调一下,和00000000都是补码,而不是原码。

加减法运算

  • 原码到补码的转化:符号位是要单独提取出来的,不参与“取反加一”。如:

()原转化为补码:
a.将0000000取反加一后,等于
b.因为a得到的超过了七位,去掉a中的1,再将题目中1给不上去。这里强调的是题目中的1和a中的1是不同的。

  • 补码的运算是连同符号位一起运算的。这里顺便提一下,二进制乘法的运算符号跟十进制乘法一样,符号位另算。
小讯
上一篇 2025-02-19 17:36
下一篇 2025-04-10 18:42

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/117155.html