# 2. 数制和编码

# 2.1 定点数表示

# 2.1.1 原码表示

XT为正数时,Xn1=0,Xi=Xi当X_T为正数时,X_{n-1} =0,X_i=X^{'}_i
XT为正数时,Xn1=1,Xi=Xi当X_T为正数时,X_{n-1} =1,X_i=X^{'}_i

由原码定义可知,0的表示不唯一,存在正0和负0

# 2.1.2 补码表示

正数补码等于原码
负数补码等于除符号位,原码取反加一

对于n位二进制整数的补码,[XT]补码=2n+XT对于n位二进制整数的补码,[X_T]_{补码}=2^n+X_T

# 2.1.3 移码表示

浮点数的阶一般采用移码表示法,每个阶都加上一个偏置常数,通常为2n12^{n-1}2n112^{n-1}-1

# 2.2 整数的表示

# 2.2.1 无符号整数和带符号整数的表示

c 语言中无符号整数和带符号整数的转换机器数不变,解释发生改变

# 2.2.2 浮点数表示

第 0 位为符号位 S,1-8 位为移码表示的阶码,9-31 位为 24 位 2 进制原码小数

# 2.2.3 IEEE 754 浮点数标准

32 位单精度格式
第 0 位表示符号位 S,1-8 位为移码表示的阶码,9-31 位为 24 位 2 进制原码小数
IEEE 754 规定隐藏位 1 位于小数点之前
单精度偏置常数为 127
IEEE 754 规定:

符号阶码尾数
0/100+-0
0/12550++-\infin
0/10<e<255f2e127(1.f)2^{e-127}(1.f)
0/10f!=02126(0.f)2^{-126}(0.f)

# 2.2.4 c 语言的浮点数类型

c 语言中有 float 和 double 两种不同浮点数类型,分别对应 IEEE 754 中单精度和双精度格式
int 转 float 不会溢出但有效位会被舍弃
int、float 转 double 无影响
double 转 float 可能发生溢出、有效位被舍弃
double 转 int 可能发生溢出且会向下取整

# 2.3 数据的宽度和存储

# 2.3.1 数据的宽度

二进制单元的每一位称为一个 bit,用 b 表示
一个字节为 8 个比特 1B=8b
在计算机科学中,"字"(Word)、"字节"(Byte)和 "字长"(Word Length)是三个不同的概念,它们表示了计算机系统中不同层次的数据单位和处理能力。

  1. 字(Word):在计算机体系结构中,"字" 是一个基本的数据单位,表示处理器一次能够处理的二进制数据的位数或字节数。例如,32 位体系结构中的字是由 32 个二进制位(或 4 个字节)组成的,64 位体系结构中的字则由 64 个二进制位(或 8 个字节)组成的。字的长度是由计算机的体系结构决定的,不同的计算机体系结构可能具有不同的字长度。
  2. 字节(Byte):字节是计算机中常用的存储单位,它表示 8 个二进制位的数据。字节是计算机存储和传输数据的基本单元,通常用于表示字符、整数、浮点数等数据。例如,一个 ASCII 字符通常占用一个字节的存储空间。字节是较小的数据单位,它是由多个字节组合而成的,用于表示更大范围的数据。
  3. 字长(Word Length):字长是指计算机处理器中寄存器和数据总线的位数。它表示处理器一次能够处理的二进制数据的位数。例如,一个 32 位的字长意味着处理器的寄存器和数据总线都是 32 位的,能够同时处理 32 位的二进制数据。字长通常与计算机的处理能力和性能有关,较长的字长可以处理更大范围的数据和执行更复杂的计算。

总结:

  • "字"(Word)是计算机体系结构中的基本数据单位,表示处理器一次能够处理的二进制数据的位数或字节数。
  • "字节"(Byte)是计算机中常用的存储单位,表示 8 个二进制位的数据。
  • "字长"(Word Length)是指计算机处理器中寄存器和数据总线的位数,表示处理器一次能够处理的二进制数据的位数。

# 2.3.2 数据的存储

最低有效位(LSB)和最高有效位(MSB)是指在二进制数据中的最低位和最高位。

在二进制数中,最低有效位(LSB)是数值的最右边的位,它代表数值中的最小权重。最高有效位(MSB)是数值的最左边的位,它代表数值中的最大权重。例如,对于二进制数 1101,最低有效位是 1(202^0),最高有效位是 1(232^3)。

大小端存储方式是计算机系统在内存中存储多字节数据类型(如整数、浮点数)的字节顺序。具体来说,大小端存储方式决定了多字节数据类型中的字节如何在内存中排列。

  1. 大端存储(Big Endian):在大端存储方式下,最高有效字节(MSB)被存储在最低的内存地址处,而最低有效字节(LSB)被存储在最高的内存地址处。这类似于将整数从左到右写入内存,使得最高有效位排在最前面。例如,对于整数值 0x12345678,在大端存储方式下,它的字节排列如下:

    1
    2
    地址: 0x1000    0x1001    0x1002    0x1003
    数据: 0x12 0x34 0x56 0x78

  2. 小端存储(Little Endian):在小端存储方式下,最低有效字节(LSB)被存储在最低的内存地址处,而最高有效字节(MSB)被存储在最高的内存地址处。这类似于将整数从右到左写入内存,使得最低有效位排在最前面。例如,对于整数值 0x12345678,在小端存储方式下,它的字节排列如下:

    1
    2
    地址: 0x1000    0x1001    0x1002    0x1003
    数据: 0x78 0x56 0x34 0x12

选择使用大端存储方式或小端存储方式是由计算机体系结构和操作系统决定的。常见的体系结构如 x86、ARM 和 PowerPC 都使用小端存储方式。而网络协议(如 TCP/IP)通常使用大端存储方式进行数据传输。

在跨平台开发中,需要注意大小端存储方式的差异,以确保在不同体系结构上正确解释和处理多字节数据类型。

# 2.4 数据的运算

# 2.4.1 按位运算和逻辑运算

| 按位或
& 按位与
~按位非
^ 按位异或
|| 逻辑或
&& 逻辑与
!逻辑非

# 2.4.2 左移和右移运算

逻辑移位:补 0
算术移位:左移低位补 0,右移高位补符号位

# 2.4.3 位扩展和位截断运算

0 扩展:无符号数前补 0
符号扩展:带符号数前补符号

对于 IA-32 架构下,采用小端存储方式,位截断操作一般保留低地址数据,

# 2.4.4 整数加减运算

Sub=1 做减法
Sub=0 做加法
零标志 ZF 判断结果是否为 0
溢出标志 OF OF=1 表示带符号整数加减法发生溢出 当 X 和 Y 的符号位相同而结果不同,OF=1
符号标志 SF 结果的最高位
进 / 借位标志 CF 判断是否发生进 / 借位 CF=SubCF=Sub\oplus