原码
原码是二进制数字的一种简单的表示法 二进制首位为符号位 1代表负0代表正
原码 0000 1000 <= 8
原码 1000 1000 <= -8
反码
反码可由原码得到 如果是正数反码与原码相同 如果是负数反码是其原码(符号位除外)各位取反而得到的
反码 0000 1000 <= 原码 0000 1000 <= 8
反码 1111 0111 <= 原码 1000 1000 <=-8
补码
补码可由反码得到 如果是正数补码与反码相同 如果是负数补码是对反码末位加1而得到的(有进位则进位 但不改变符号位)
补码 0000 1000 <= 反码 0000 1000 <= 原码 0000 1000 <= 8
补码 1111 1000 <= 反码 1111 0111 <= 原码 1000 1000 <=-8
实例
-128 ~ 127 <= signed char
补码 0111 1111 <= 127
补码 0000 0000 <= +0
补码 1000 0001 <= 反码 1000 0000 <= 原码 1111 1111 <= -127
-
补码 (1) 0000 0000 <= 反码 1111 1111 <= 原码 1000 0000 <= -0
-
因为-0和+0的补码都表示0 所以0的原码被拿来表示-128
-
补码 1000 0000 <= -128 不考虑符号位等同于 原码 1000 0000 <= 128
小结
- 补码的意义在于 减法变成加法
100 - 8 => 100 + (-8)
i - j = i - j + (2^n - 1 + 1) = i + (2^n - 1 - j + 1) = i + ((2^n - 1 - j) + 1)
- 减去一个数 = 加上一个数的补码 (反码 + 1)
100000000 - 00001000
= (11111111 + 00000001) - 00001000
= 11111111 - 00001000 + 1
= 11110111 + 1 // 补码 = 反码 + 1
= 11111000 // 补码 = F8
综上所述 计算机都是加法运算 所谓的负数都是表达方式定义
网友评论