“三码” 之间的转换

注意:以下的分析均以 1 字节 进行

正数负数
原码数据的二进制形式数据的二进制形式
反码等于原码原码的符号位不变,其他位取反
补码等于原码负数的反码 “+1”

注意:无符号数,正数,它们的 原码 = 反码 = 补码
负数: 反码 = 原码的符号位不变,其他位取反
补码:反码 + 1.

重要:负数在计算机中存储的是补码。

计算机中为啥要用补码呢?

  • 1,将减法运算变为加法运算:

就拿 6-10==-4 来举个例子:
如果没有补码,则计算如下:
6 + (-10) = -4
0000 0110
+1000 1010

1001 0000 = -16 (则计算结果错误)

如果有补码:
0000 0110
1111 0110(- 10 的补码)

1111 1100(-4 的补码)——>1000 0011——>1000 0100== -4

在上述补码的计算中我们也可以得出一个负数由补码到原码的计算方法:“原码 = 补码取反 + 1”

  • 2,统一了 “0” 的编码 :
    +0 0000 0000 0000 0000(反码)== 0000 0000(补码)
    -0 1000 0000 1111 1111(反码) == 0000 0000 (补码)

计算机对数据的存储与读取

  • 有符号取(%d,%hd,%ld)

首先看内存的最高位,如果最高位为 1,则将内存数据的符号位不变,取反 + 1 到原码;如果最高位是 0 ,将数据原样输出。

  • 无符号取(%u,%x,%o,%lu)

将内存数据原样输出

小结
  • %x,%u,%o 都是输出内存的原始数据
  • 十六进制是以原码存储的
  • 每四位二进制代表一位十六进制