3.1 运算

按位运算:按位与、按位或、按位取反、按位异或

逻辑运算:逻辑与、逻辑或、逻辑非

移位运算:算数左移、逻辑左移、算术右移、逻辑右移

  • 算数左移、逻辑左移:高位移出,低位补零
    • 对于无符号数,若高位移出的是 $1$,则发生溢出
    • 对于有符号数,若左移之后符号位发生了改变($CF \oplus SF = 1$),则发生溢出
  • 算术右移:对于有符号数,低位移出,高位补数符(正为 $0$,负为 $1$)
  • 逻辑右移:对于无符号数,低位移出,高位补零

位扩展和位截断运算

  • 位扩展:无符号数则前面补零,有符号数则前面补数符
  • 位截断:前面直接截断

小段机和大端机在机器数的运算过程中没有区别,只会影响数据在内存中的存储方式。

2.4 计算机中的数据表示

2.4.1 计算机中的数据表示

真值:真实的值

机器数:用 0/1 编码的在机器内储存的数

数据宽度:位、字节、字

2.4.2 数值数据的定点表示

正负:在所有数前面设置符号位、其余用原码 / 补码(更常用)

小数点

  • 定点整数:小数点固定在最低位的右边,表示范围 $[0, 2^n - 1]$
  • 定点小数:小数点固定在最高位的左边,表示范围 $[0, 1 - 2^{-n}]$

:原码和反码由于符号位的原因,分为正零和负零;补码的正零和负零的表示是一样的。

2.4.3 数值数据的浮点表示

IEEE754 单精度浮点数标准(阶码是移码、尾数是去掉最高位的1,会出编码与解码)

实数 / 浮点数:(IEEE 754 标准)符号位+阶码+尾数

浮点数的规格化:调整阶码的大小,使得尾数 $f$ 满足 $1 \le |f| < 2$

  • 调整方式为右规(小数点往左移,阶码加一),左规(小数点往右移,阶码减一)

使用移码表示,真值加上偏置值(通常为 $2^{n - 1} - 1$)得到机器数

规格化数

单精度浮点数双精度浮点数
符号位 $s$负数为 $1$,正数为 $0$负数为 $1$,正数为 $0$
阶码 $e$$8$ 位,偏置常数为 $2^7 - 1 = 127$,表示范围为 $[0000 0001 (-126), 11111110 (127)]$$11$ 位,偏置常数为 $2^{10} - 1 = 1023$,表示范围为 $[-1022, 1023]$
尾数 $f$尾数有 $23$ 位,精度为 $24$ 位
全 0 / 全 1 编码用来表示特殊的值
有效数字为 $1.\overline{f}$,最高位的 $1$ 隐含表示
尾数有 $52$ 位,精度为 $53$ 位
全 0 / 全 1 编码用来表示特殊的值
有效数字为 $1.\overline{f}$,最高位的 $1$ 隐含表示
真值$(-1)^s \times 1.\overline{f} \times 2^{e - 127}$$(-1)^s \times 1.\overline{f} \times 2^{e - 1023}$

特殊值表示

阶码阶码尾数数据类型
$0/1$$[1, 254]$任何值规格化数
$0/1$$0$非零数非规格化数
$0/1$$0$$0$$+0 / -0$
$0/1$全 $1$$0$$+\infty / -\infty$
$0/1$全 $1$非零数$NaN$

非规格化数:用来表示比规格化数更小的数,真值为 $(-1)^s \times 0.\overline{f} \times 2^{-127}$

正数与浮点数的转换:

  • 整数 → 浮点 → 整数:可能丢失精度(尤其是 float)。
  • 浮点 → 整数 → 浮点:一定会丢失小数部分。
  • double 因为精度更高,对 32 位 int 可以保证无损,但对于 float 或更大整数仍可能出问题。

2.4.4 数值数据的十进制表示

ASCII码:将数视作字符串,分成前分隔数字串、后嵌入数字串

BCD码:将每个位用 4 位二进制数表示,十进制有权码(8421码)

十进制无权码(余3码 / 格雷码):余3码好处是做十进制运算的时候便于进位,格雷码好处是相邻两数只有一位发生变化

2.4.5 字符数据的机器表示

西文字符:ASCII码

中文字符

  • 输入码:对每个汉字用相应按键进行编码表示,用于输入
  • 内码:用于在系统中进行存储、查找、传送等
  • 字模点阵码或轮廓描述: 描述汉字的字模点阵或轮廓,用于显示或打印

图像

  • 像素(pixel):构成图像的最小单位,即屏幕上的小圆点
  • 颜色(color):任何颜色都可由红、绿和蓝三色调配而成
  • 像素的颜色:用3个字节的二进制数表示

2.4.6 数据的度量与存储

大小端存储、不同类型结构体内的数据对齐方式

数据存放的方式:

  • 大端存储:地址先存放高位的数据,再存放低位的数据
  • 小端存储:地址先存放低位的数据,再存放高位的数据(绝大多数现代计算机)