机组--原码、补码、反码、移码
首先,对于正数而言,原码=反码=补码
在开始下面内容前,做以下约定:X表示真值,[X]原表示原码,[X]反表示反码,[X]补表示补码。并且您可能需要一定的将十进制数转化为二进制数的基础。
有符号数与无符号数
原码
机器数最高位表示符号,其余位表示该数的绝对值
如果规定了机器字长,而我们的原码位数又不够时,需要我们进行补零,之后再修改符号位。
具体的:
-
当为整数时:在有效数值最高位前面补零,不影响整体取值。之后将最高位修改为符号位
假定机器字长为8位
X=+27 ,[X]原:00011011
X=−27 ,[X]原:10011011
-
当为小数时:在有效数值最低位后面补零,不影响整体取值。之后再将最高位修改为符号位
假定机器字长为8位(定点小数表现形式可见下方"定点小数")
X=+0.625,[X]原:[0.1010000]
X=−0.625,[X]原:[1.1010000]
值得注意的是,真值0有两种不同形式表达:[+0]原=[0000]、[−0]原=[1000]
机器数的定点表示
-
定点小数:纯小数,小数点 .
位置在符号位之后、有效数值部分最高位之前。符号位:+
:0、-
:1,位于最前。
这里的纯小数指的是,整数部分为零。0.0101 √、1.0101 ×、
如:[+0.625]原=[0.101]、[−0.125]原=[1.001]
-
定点整数:纯整数,小数点 .
位置在有效数值位最低位之后。且在最前面用逗号,
将整数部分与符号位隔开
如:[+27]原 = 0,11011、 [−27]原 = 1,11011
反码
对于正数,其反码与原码形式一致。
[+27]原=00011011 => [+27]反 = 00011011
[+0.625]原=[0.1010000] => [+0.625]反=[0.1010000]
对于负数,将原码的符号位保持不变,其余部分按位取反。
假定机器字长8位
[−27]原 = 10011011 => [−27]反 = 11100100
[−0.625]原=[1.1010000] => [+0.625]反=[1.0101111]
补码
原码转补码:
对于正数,其补码与原码形式一致。
对于负数,在反码的基础上+1。
[−27]原 = 10011011 => [−27]补= [−27]反+1 = 11100100 +1 = 11100101
[−0.625]原=[1.1010000] => [−0.625]补 = [−0.625]反+1=1.0101111+1 = 1.0110000
另法一:
假设负纯整数X,将其转化为原码共有二进制位数N+1,则X补码为:[2N+1−|X|]
如:X = -13 =[−1101] => [−1101]原=[11101] ,其中二进制位数为 5 => 25=32,
因此其 补码为:[X]补=32−|−13|=19=[10011]
另法二:
对负定点小数的原码X,从右往左扫描,尾数的第一个1及其右部的0保持不变,左部的各位取反,符号位保持不变。
如[X]原=[1.1110011000] =>1.0001101000
补码转原码:
规则:对于负数,补码的除符号位取反后+1
[−13]补=[10011] =>取反=>[11100] =>+1=>[−13]原=[11101]
移码
一个真值的移码和补码仅差一个符号位,将补码符号位取反即可得到移码。
附录
一些码的可表示范围:
n 位码 |
最小值 |
最大值 |
无符号小数 |
0 |
1−2−n |
无符号整数 |
0 |
2n−1 |
定点小数 |
−(1−2−n) |
1−2−n |
定点整数 |
−(2n−1) |
2n−1 |
原码纯小数 |
−(1−2−(n−1)) |
1−2−(n−1) |
原码纯整数 |
−(2(n−1)−1) |
2(n−1)−1 |
反码纯小数 |
−(1−2−(n−1)) |
1−2−(n−1) |
反码纯整数 |
−(2(n−1)−1) |
1−2−(n−1) |
补码纯小数 |
−1 (比原码多表示−1) |
1−2−(n−1) |
补码纯整数 |
−2n (比原码多表示−2n) |
2(n−1)−1 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通