目录
介绍
原码
反码
补码
为什么八位二进制数表示范围为 - 128~+127?
介绍
计算机中的符号数有三种表示方法, 即原码, 反码和补码. 三种表示方法均有符号位和数值位两部分, 符号位都是用 0 表示 "正", 用 1 表示 "负", 而数值位, 三种表示方法各不相同.
原码
原码 (true form) 是一种计算机中对数字的二进制定点表示方法. 原码表示法在数值前面增加了一位符号位(即最高位为符号位): 正数该位为 0, 负数该位为 1(0 有两种表示:+0 和 - 0), 其余位表示数值的大小.
优点:
简单直观; 例如, 我们用 8 位二进制表示一个数,+11 的原码为 00001011,-11 的原码就是 10001011
缺点:
原码不能直接参加运算, 可能会出错. 例如数学上, 1+(-1) = 0, 而在二进制中 00000001+10000001=10000010, 换算成十进制为 - 2. 显然出错了.
反码
反码表示法规定: 正数的反码与其原码相同; 负数的反码是对其原码逐位取反, 但符号位除外.
补码
补码表示法规定: 正数的补码与其原码相同; 负数的补码是在其反码的末位加 1.
在计算机系统中, 数值一律用补码来表示和存储. 原因在于, 使用补码, 可以将符号位和数值域统一处理; 同时, 加法和减法也可以统一处理. 此外, 补码与原码相互转换, 其运算过程是相同的, 不需要额外的硬件电路.
为什么八位二进制数表示范围为 - 128~+127?
首先八位二进制数 0000 0000 ~1111 1111, 一共可以表示 28=256 位数, 如果表示无符号整数可以表示 0~255. 计算方法就是二进制与十进制之间的转换.
如果想要表示有符号整数, 就要将最前面一个二进制位作为符号位, 即 0 代表正数, 1 代表负数, 后面 7 位为数值域, 这就是原码定义. 这样在现实生活中完全没有问题, 但在计算机中就出现了问题.
数的表示
在原码中, 0 的表示有两种(+0)0000 0000,(-0)1000 0000, 这样就产生了编码映射的不唯一性, 在计算机上就要区分辨别. 然而 + 0,-0 却没有什么现实意义.
数的运算
为了解决上述数的表示问题, 我们可以强制把转换后的 10000000 强制认定为 - 128. 但这又出现了一个新的问题就是数的运算. 数学上, 1+(-1)=0, 而在二进制中 00000001+10000001=10000010, 换算成十进制为 - 2. 显然出错了. 所以原码的符号位不能直接参与运算, 必须和其他位分开, 这就增加了硬件的开销和复杂性.
这个时候就要引入补码, 补码表示法规定: 正数的补码与其原码相同; 负数的补码是在其反码的末位加 1. 反码定义为: 正数的反码与其原码相同; 负数的反码是对其原码逐位取反, 但符号位除外.
问题 1: 为什么要引入补码呢?
先解决第一个问题, 引入补码是为了解决计算机中数的表示和数的运算问题, 使用补码, 可以将符号位和数值域统一处理, 即引用了模运算在数理上对符号位的自动处理, 利用模的自动丢弃实现了符号位的自然处理, 仅仅通过编码的改变就可以在不更改机器物理架构的基础上完成的预期的要求.
问题 2: 负数补码定义为什么是相对应的正数原码取反加一?
要解决第二个问题同时理解补码, 首先要理解 "模".
模的概念可以帮助理解补数和补码.
"模" 是指一个计量系统的计数范围. 如时钟等. 计算机也可以看成一个计量机器, 它也有一个计量范围, 即都存在一个 "模". 例如:
时钟的计量范围是 0~11, 模 = 12. 表示 n 位的计算机计量范围是 0~2(n)-1, 模 = 2(n).
"模" 实质上是计量器产生 "溢出" 的量, 它的值在计量器上表示不出来, 计量器上只能表示出模的余数. 任何有模的计量器, 均可化减法为加法运算.
例如: 假设当前时针指向 10 点, 而准确时间是 6 点, 调整时间可有以下两种拨法: 一种是倒拨 4 小时, 即: 10-4=6; 另一种是顺拨 8 小时: 10+8=12+6=6
在以 12 模的系统中, 加 8 和减 4 效果是一样的, 因此凡是减 4 运算, 都可以用加 8 来代替. 对 "模" 而言, 8 和 4 互为补数. 实际上以 12 模的系统中, 11 和 1,10 和 2,9 和 3,7 和 5,6 和 6 都有这个特性. 共同的特点是两者相加等于模.
对于计算机, 其概念和方法完全一样. n 位计算机, 设 n=8, 不讨论符号位, 则所能表示的最大数是 11111111, 若再加 1 成为 100000000(9 位), 但因只有 8 位, 最高位 1 自然丢失. 又回了 00000000, 所以 8 位二进制系统的模为 29. 在这样的系统中减法问题也可以化成加法问题, 只需把减数用相应的补数表示就可以了. 把补数用到计算机对数的处理上, 就是补码.
- A + B
- 0011 1100
- 0000 1101
- --------------
- 0100 1001
- A - B =
- 0011 1100
- 1111 0011
- --------------
- 0010 1111
- B - A =
- 1100 0100
- 0000 1101
- --------------
- 1101 0001
来源: http://www.bubuko.com/infodetail-2821412.html