原码反码补码

原码反码补码(总结)


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

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

反码:

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

补码:

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

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


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

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

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

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

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

按照我们一般认为,如果8位中一位作为符号,那么应该是11111111<=取值范围<=01111111,或者写成-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

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

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

加减法运算

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

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

  • 补码的运算是连同符号位一起运算的。这里顺便提一下,二进制乘法的运算符号跟十进制乘法一样,符号位另算。
原码反码补码计算口诀是: 1. 原码:符号位加上真值的绝对值。 2. 反码:将原码中的符号位保持不变,其余位取反。 3. 补码:反码加1。 例如,对于一个8位二进制数,如果要计算其反码,可以按照以下步骤进行: 1. 将符号位保持不变。 2. 将其余位取反。 对于补码的计算,可以按照以下步骤进行: 1. 先计算其反码。 2. 在反码的基础上加1。 这样,就可以得到原码、反码和补码的计算结果。 #### 引用[.reference_title] - *1* [原码, 反码, 补码的基础概念和计算方法](https://blog.csdn.net/Chinajsczlymyc/article/details/126910306)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [(转)java 原码反码补码计算 以及 取反运算,原码反码补码运算公式](https://blog.csdn.net/PacosonSWJTU/article/details/128604733)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [原码,补码,反码概念和计算方法详解](https://blog.csdn.net/qq_39541098/article/details/122729622)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡卡罗特琪琪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值