反码、补码

原码和反码都是为了计算补码,计算机底层都是补码

  • 反码(1’s complement)

    正数反码,和原码一样
    负数的反码,是在原码的基础上保持符号位不变,其他位取反

  • 补码(2’s complement)

    正数和 0 的补码,是该数字本身再补上最高比特 0
    负数的补码,是将其对应正数按位取反再加 1

clock_for_buma

负十进制转换为二进制的方式

  • 先将该十进制的绝对值转换为二进制,然后对得到的二进制进行按位取反,再加 1(负数的需要补码:按位取反,再加 1)
  • 验证:可以用 负+正 = 0 的法则来验证两个二进制相加是不是等于 0

负二进制转换为十进制的方式

  • 先减 1 再按位取反,合并为十进制整数后添加负号

  1. 补码 1111 0100 转为十进制

    最高位为 1,是负数的补码 => 先减 1: 1111 0011 => 按位取反:0000 1100 => 转为十进制:12 => 添加负号:-12

  2. 补码 0000 1001 转为十进制

    最高位为 0,是正数的补码 => 补码 == 原码:0000 1001 => 转为十进制:9

  3. 反码 1100 1101 转为十进制

    最高位为 1,是负数的补码 => 按位取反(符号位不变):1011 0010 => 转为十进制:-50

  4. 反码 0101 0011 转为十进制

    最高位为 0,是正数的反码 => 反码 == 原码:0101 0011 => 转为十进制:83

字、字节、位

总线一般被设计来传输固定大小的一块数据,这块数据被称为字(word)

一个字包含的字节数(即字的大小)是各种计算机系统里面的基本参数,而且这个参数在不同的系统中通常是不同的
大多数的现代计算机系统里:一个字是 4 个字节(32 位系统)或 8 个字节(64 位系统)

结论

一个字等于多少个字节,与系统硬件(总线、CPU 命令字位数等)有关

  • 1 字节(byte) = 8 位(bit)

  • 在 16 位的系统中(如 8086 微机):1 字(word)= 2 字节(byte)= 16(bit)

    在 32 位的系统中(如 win32):1 字(word)= 4 字节(byte)= 32(bit)

    在 64 位的系统中(如 win64):1 字(word)= 8 字节(byte)= 64(bit)

字符编码

概述:为了方便计算机识别各个国家的文字,就需要将这些文字采用数字编号的方式进行描述并建立对应的关系表,该表就叫做编码表

字符编码和字符集是两个不同层面的概念
encoding 是 charset encoding 的简写,即字符集编码,简称编码
charset 是 character set 的简写,即字符集

编码依赖于字符集一个字符集可以有多个编码实现,就像代码中的接口实现依赖于接口一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
flowchart BT
subgraph Unicode
direction BT
F(UTF-8 编码) --> E(Unicode 字符集)
G(UTF-16 编码) --> E
H(UTF-32 编码) --> E
end
subgraph ASCII
direction BT
A(ASCII 编码) --> B(ASCII 字符集)
end
subgraph GBK
direction BT
C(GBK 编码) --> D(GBK 字符集)
end
classDef invisible fill-opacity:0,stroke-opacity:0
class ASCII invisible
class GBK invisible
class Unicode invisible

常见的编码表

  • ASCII:美国标准信息交换码, 使用一个字节的低 7 位二位进制进行表示
  • ISO8859-1:拉丁码表,欧洲码表,使用一个字节的 8 位二进制进行表示
  • GB2312:中国的中文编码表,最多使用两个字节 16 位二进制为进行表示
  • GBK:中国的中文编码表升级,融合了更多的中文文字符号,最多使用两个字节 16 位二进制位表示
  • Unicode:国际标准码,融合了目前所有字符,为每个字符分配唯一的字符码。所有的文字都用两个字节 16 位二进制位来表示

编码的发展

  • 面向传输的众多 UTF(UCS Transfer Format)标准出现了,UTF-8 就是每次 8 个位传输数据,而 UTF-16 就是每次 16 个位。这是为传输而设计的编码并使编码无国界,这样就可以显示全世界上所有文化的字符了
  • Unicode 只是定义了一个庞大的、全球通用的字符集,并为每个字符规定了唯一确定的编号,具体存储成什么样的字节流,取决于字符编码方案。推荐的 Unicode 编码是 UTF-8 和 UTF-16
  • UTF-8:变长的编码方式,可用 1-4 个字节来表示一个字符