补码原码总结.md

文章目录


正数没有什么好说的,原码反码补码皆是一样的;

对于负数,要注意了:
只要是从补码推原码,一律是取反加一,例如下面一个例子:

补码----------------------------------------------------------------> 原码
1111 1111 1000 0001(-1)

下面以八位二进制进行举例:
补码----------------------------------------------------------------> 原码
0000 0000 0000 0000
0000 0001 0000 0001
……
0111 1111 127
1000 0000 -128
10000 0001 -127
……
1111 1111 -1

小结:有符号位八位二进制数值范围:-128~127(负数与非负数的个数一样:-128,-127,…-1共计128个负数,0,1,2,3,4…127共计128个非负数)

补码推导原码:
注意 :在OD中,寄存器中的值一般都是以补码形式出现的.!!!!!
1111 1111 取反为0000 0000
再加1,为00000001,由于它是一个负数
所以原码为1000 0001(-1)

小结:补推原:取反加1,添加符号位

原码推导补码 :
与补码推导原码有一点不同,
保持符号位不变,然后再取反加一
例子:已知10000001(-1)求其补码 (加1)
1000 0001(保持符号位不变,取反)-------->1111 1110-------------->1111 1111(-1的补码)

这里需要注意的是:如果将1000 0001看成补码的话,那么进行上面的"补推原"操作,
将会得到0111 1111(127)----->(添加符号位)1111 1111(-127)
也就是说补码位1000 0001的原码为-127
小结:原推补,保持符号位不变, 取反加1,

image.png

二进制与十六进制之间的转换:
二进制 十六进制
0000---------->0
0001----------->1

0010------------>2
0011------------>3

0100------------>4
0101------------>5

0110------------>6
0111------------>7

1000------------->8
10001----------->9

101 0------------>A
101 1------------>B

110 0------------>C
110 1------------->D

111 0----------->E
111 1------------>F

<think>嗯,用户问的是补码1.0111100转原码的问题。首先,我得回忆一下补码原码之间的转换规则。补码通常用于计算机中表示有符号数,转换的时候需要考虑符号位。 补码的最高位是符号位,这里给出的补码1.0111100,所以符号位是1,表示这是一个负数。负数的补码原码的话,通常的方法是符号位不变,其余各位取反,然后加1。不过这里可能需要再仔细确认步骤是否正确。 首先,我需要确认补码的转换步骤是否正确。对于负数,原码补码的方法是符号位不变,数值位取反加一。那么反过来,补码原码的话,应该是同样的过程:符号位保持为1,数值位取反加一。或者是不是应该先减一,再取反? 这时候可能需要再仔细回忆补码的定义。补码的负数表示是对应正数的原码取反加一,所以反过来,从补码得到原码的话,应该是先减一,再取反,符号位保持不变。是的,正确的步骤应该是这样的。 所以现在,给定的补码1.0111100。符号位是1,剩下的数值位是0111100。那么首先,要减一,得到什么呢?数值位部分减一的话,可能需要二进制减法。这里的数值位是0111100,减一的话,应该变成0111011。然后再取反,即各位取反,得到1000100。然后符号位保持为1,所以原码应该是1.1000100。 不过这里需要注意,补码的位数是否固定?例如,如果是8位补码的话,那么转换后的原码也应该是8位。这里给出的补码1.0111100,共有8位,符号位1位,数值位7位。所以转换后的原码也应该是8位,符号位加7位数值位。 不过让我再检查一遍步骤是否正确。补码1.0111100,符号位为1,负数。转换步骤是:补码原码,对于负数来说,就是补码补码,也就是再次取反加一,还是先减一后取反? 可能我在这里混淆了步骤。正确的步骤应该是:补码转换为原码,负数的情况下,需要将补码的数值部分取反加一,或者先减一再取反? 比如,补码是取原码取反加一得到的,所以原码应该是补码减一后取反,符号位不变。比如,补码1.0111100,减一得到1.0111011,然后取反数值位,变成1.1000100。对吗? 或者另一个方法,补码补码就是原码,所以如果对补码再次取反加一,符号位不变,是否得到原码? 比如,补码1.0111100,取反数值位得到1.1000011,再加一得到1.1000100,这样结果是一样的。所以两种方法都可以。 所以,无论用哪种方法,最后得到的原码应该是1.1000100。也就是符号位不变,数值部分先取反后加一,或者先减一后取反,结果相同。 现在验证一下是否正确。假设原码1.1000100,那么它的补码应该是:原码取反加一。原码的数值部分是1000100,取反是0111011,加一变成0111100,所以补码1.0111100,和题目中的一致。所以正确。 所以最终转换后的原码1.1000100。或者用小数点的话,可能用户给出的例子是定点数,比如小数点在最前面?可能需要确认位数,但根据给出的例子,补码1.0111100,共8位,所以原码也是8位,符号位加七位数值位。 因此,正确的转换步骤应该是:补码1.0111100,作为负数,转换为原码时,符号位不变,数值部分取反加一,得到1.1000100。或者另一种方法,补码减一,得到1.0111011,然后取反得到1.1000100。 所以结论是原码1.1000100。这样对吗?是的,因为验证后确实能转换回去。</think>补码转换为原码的步骤如下,我们以补码 `1.0111100` 为例逐步分析: --- ### **1. 确定符号位** 补码的最高位是符号位: - **`1`** 表示负数,**`.0111100`** 是数值部分。 --- ### **2. 负数补码原码的规则** **负数的补码原码** 需两步操作: 1. **数值部分取反**(按位取反,符号位不变)。 2. **结果加 1**(仅在数值部分加 1,符号位不变)。 --- ### **3. 具体转换步骤** #### **步骤 1:数值部分取反** 原补码的数值部分为 `.0111100`,取反后为 `.1000011`: ``` 0 1 1 1 1 0 0 ← 原数值部分 ↓ ↓ ↓ ↓ ↓ ↓ ↓ 1 0 0 0 0 1 1 ← 取反后的数值部分 ``` 此时得到中间结果:**`1.1000011`**(符号位保持 `1`)。 #### **步骤 2:数值部分加 1** 将取反后的数值部分 `.1000011` 加 1: ``` 1 0 0 0 0 1 1 + 1 --------------- 1 0 0 0 1 0 0 ``` 最终数值部分为 `.1000100`,符号位仍为 `1`,因此原码为:**`1.1000100`**。 --- ### **4. 验证正确性** 原码 `1.1000100` 转换为补码的步骤如下: 1. 数值部分取反:`.1000100` → `.0111011` 2.1:`.0111011 + 1 = .0111100` 3. 符号位保持 `1`,得到补码:`1.0111100`,与题目一致。 --- ### **最终结果** 补码 **`1.0111100`** 对应的原码为: **`1.1000100`** --- ### **总结** - **负数补码原码**:数值部分取反 → 加 1。 - **正数补码原码**:与原码相同(符号位为 `0`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值