正数
原码
和 反码
和 补码
都是一样的不会发生变化
因此,计算的时候先看第一位 符号位 ,只要能发现是正数,三者都不变
移码
在补码基础上将符号位取反
负数
负数的情况比较复杂
原码 & 反码
- 符号位不变
- 数值位都取反
反码 -> 补码
- 末尾 加 1
原码 <-> 补码
- 从右向左找到第一个 “1”
- “1” 左边所有的
数值位
按位取反
原理
末位加1,各项从右依次取反,因此从右向左走第一个“1”的右面补码都已经按位取反,负负得正,只需调整左面即可
补码的相反数
取反(按位取反)
:将补码中的每一位取反,即0变为1,1变为0。这一步操作称为“取反”或“按位取反”。
加1
:在取反后的结果上加上1。
两个步骤结合起来,就可以将一个补码表示的数变为其相反数。
例子
假设有一个8位补码表示的数 00001001(即十进制的9),我们想要将其变为其相反数。
取反
:
-
原数:00001001
-
取反后:11110110
加1:
取反后的数
:11110110
加1后
:11110111
因此,00001001 的相反数是 11110111,即十进制的 -9。
验证
为了验证这个结果,我们可以将 11110111 转换回十进制:
最高位是1,表示这是一个负数。
取反:00001000
加1:00001001
结果是9,但由于最高位是1,所以是 -9。
特殊情况
对于补码表示的最小值(例如8位补码的最小值是 10000000,即 -128),其相反数在补码系统中没有对应的正数表示,因为补码系统的正数范围比负数范围少1。在这种情况下,最小值的相反数仍然是它自己。
移码 <- Other
在补码基础上将符号位取反
方法总结
- 首先根据符号位判断
正负
- 若为
正
则都不变,移码变符号位;若为负
则需要进一步的分情况讨论 -
- 若为
原反
符号不变数值变; - 若
反补
, 单向末位要加 1; - 若
原补
从右到左先找 “1”,1左取反 - 若
补反
,先变原码再反码 - 若有
移
, 先变补码再变化
- 若为
练习
如有问题,敬请指正~