9.24
今天的课上王老师讲述了方法和递归以及处理大数字与浮点数,老师讲述的编程知识对我来说十分重要。
原码、反码、补码
- 基础概念
计算机底层只有二进制,只有加法器,没有减法器。
减法不能直接算,所以用补码把减法变成加法
约定:以8位二进制举例
符号位:0代表正数,1代表负数
原码:
原码 = 符号位 + 真值绝对值的二进制,最符合人的直觉。
- 正数:+5 → 8位原码:00000101
- 负数:-5 → 8位原码:10000101
原码缺点:
- 有两个0:+0(00000000)、-0(10000000),一个数字占两个编码,浪费空间
- 不能直接做加减运算。
例:用原码计算:00000001 + 10000001 = 10000010,结果是-2,明显错误。
所以原码只用来读写,不能直接运算。
反码:
反码是过渡产物,用来推导补码,计算机不存储反码。
规则:
- 正数:反码 = 原码
- 负数:符号位不变,数值位全部取反(0变1,1变0)
举例(8位):
+5 原码00000101,反码00000101 -5 原码10000101,反码11111010
反码缺点:
依然存在两个0:00000000(+0)、11111111(-0),加减计算依然有问题。
补码(计算机真正存储、运算的编码)
规则:
- 正数:补码 = 反码 = 原码
- 负数:补码 = 反码 + 1
举例(8位):
-5
原码:10000101
反码:11111010
补码:11111011
-
只有一个0:00000000
原来的10000000不再代表-0,直接用来表示-128,多存一个数字。
8位补码取值范围:[-128, 127] -
减法可以转为加法运算
示例:计算 1 - 1等价 1 + (-1)
1的补码:00000001
-1的补码:11111111
相加:00000001 + 11111111 = 1 00000000
8位存储,最高位溢出丢弃,结果00000000,也就是0

浙公网安备 33010602011771号