专业的编程技术博客社区

网站首页 > 博客文章 正文

了解二进制编码:原码、反码、补码与移码

baijin 2025-07-10 13:05:13 博客文章 2 ℃ 0 评论

原码(Sign-Magnitude)

原码是最直观的编码方式,它的最高位是符号位(0表示正数,1表示负数),其余位表示数值本身的绝对值。

  1. 表示

原码采用最直观的符号-绝对值表示法:

  • 符号位(最高位):0表示正数,1表示负数
  • 数值位(其余位):存储数二进制形式绝对值

特点

  • 表示范围:-(2^(n-1)-1) 到 +(2^(n-1)-1)
  • 缺陷:存在双零问题,加减运算也需要判断符号位

2. 转换

  • 正数转换:直接转换为二进制,不足位补零
  • 负数转换:取绝对值的二进制形式,最高位 置1,数值位保持原值

3. 示例

十进制

8位原码

计算过程

+7

0000 0111

直接转换7的二进制

-13

1000 1101

1(符号位) + 0001101(13的二进制)

0

0000 0000

0000 0000 或1000 0000

反码(Ones' Complement)

反码的表示方法对正数和原码相同,而对负数则是将其原码除符号位外的所有位取反。反码的设计初衷是为了解决原码在进行减法运算时的问题,使得任何数与其相反数相加等于零。

1. 表示

反码通过取反操作可以改进运算:

  • 正数:与原码相同
  • 负数:符号位保持1,数值位按位取反

特点

  • 加法需要循环进位:比如 5(0101) + (-2)(1101) = 1 0010 → 0011(3)
  • 表示范围和原码相同,也就是说仍存在双零的缺陷

2. 示例

十进制

原码

反码

转换过程

+9

0000 1001

0000 1001

正数保持原码

-6

1000 0110

1111 1001

符号位1,数值位0110取反

0

0000 0000

1111 1111

仍然存在双零问题

补码(Two’s Complement)

补码是目前计算机系统中普遍采用的编码方式,因为它能简化加法和减法的硬件实现。正数的原码、反码、补码三者相同,而负数的补码则是在其反码的基础上加1。补码的引入,解决了负零的问题,并且能够多表示一个最小值。

  1. 表示

补码有如下公式(数字定义):


特点

  • 单零表示:0的补码唯一(00000000)
  • 运算简便:A - B = A + (-B)补
  • 范围:能比原码和补码多表示一个最小值

2. 转换

  • 普通方法
原码 → 补码:
正数:保持原码不变
负数:转换为反码后+1
  • 公式计算法

整数补码 = x
负数补码 = 2^n - |x|

3. 示例

十进制

原码

反码

补码

计算验证

+19

0001 0011

0001 0011

0001 0011

直接保留原码

-7

1000 0111

1111 1000

1111 1001

反码(11111000)+1

-128

无法表示

无法表示

1000 0000

2^8 - 128 = 128

移码

移码一般用来比较大小,比如浮点数的阶码会用移码表示,通过移码的表示,较出大小变得简单直观。

1. 表示

移码通过偏移量解决指数比较问题:

- 统一公式:移码 = 真值 + 偏移量(通常为2^(n-1))

- IEEE754 标准中 偏移量为移码形式:单精度 127(8位),双精度 1023(11位)

2. 转换

1. 确定偏移量:一般为 2^(k-1),k为位数
2. 计算移码值:E = 真值 + 偏移量

3. 示例

真值

8位移码(偏移127)

计算过程

二进制

+23

150

23 + 127 = 150

1001 0110

-5

122

-5 + 127 = 122

0111 1010

0

127

0 + 127 = 127

0111 1111

4. 扩展 —— 浮点中移码的应用

以单精度浮点数 1.25×2^5 为例:

  • 指数真值:5
  • 移码表示:5 + 127 = 132 → 10000100
  • 完整编码:0 10000100 01000000000000000000000

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表