# A.4 操作数的类型与大小
<!-- source: p0680 -->

操作数类型如何指定？最常用的方法，是通过操作码中的编码指出操作数类型。另一种方法是给数据附加由硬件解释的标记；标记说明类型，系统再据此选择操作。不过，带类型标记数据的计算机，如今只能在计算机博物馆中找到。

先看桌面与服务器体系结构。通常，操作数类型——整数、单精度浮点数、字符等——实际上也确定了它的大小。常见类型包括字符（8 位）、半字（16 位）、字（32 位）、单精度浮点数（也是 1 个字）和双精度浮点数（2 个字）。整数几乎一律采用二进制补码表示。字符通常采用 <!-- source: p0681 -->ASCII，但随着计算机的国际化，Java 使用的 16 位 Unicode 日渐普及。 直到 20 世纪 80 年代初，多数计算机厂商仍自行选择浮点表示格式；此后几乎全部计算机都遵循同一标准——IEEE 754。不过，近期某些专用处理器已经不再坚持这种精度水平。附录 J 将详细讨论 IEEE 浮点标准。

有些体系结构提供字符串操作，但通常较为有限，并将字符串中的每个字节视为一个字符。典型支持包括字符串比较与传送。

为支持商业应用，一些体系结构提供十进制格式，通常称为**压缩十进制**（packed decimal）或**二进制编码十进制**（binary-coded decimal，BCD）：用 4 位编码 0–9，每字节压入两位十进制数字。数字字符串有时称为非压缩十进制；通常还提供称为压缩和展开（packing/unpacking）的操作，在两种表示之间转换。

使用十进制操作数的一个原因，是获得与十进制数精确一致的结果，因为有些十进制小数没有精确的二进制表示。例如，\(0.10_{10}\) 是简单的十进制小数，却需要无限循环的二进制位表示：\(0.0001100110011\ldots_2\)。因此，十进制下精确的计算，在二进制下可能只是近似值，这对金融交易可能构成问题。（更精确的算术讨论见附录 J。）

SPEC 基准测试使用字节或字符、半字（短整数）、字（整数和单精度浮点数）、双字（长整数）及浮点数据类型。图 A.11 给出这些程序访问存储器对象时，按对象大小统计的动态分布。不同类型的访问频率，有助于确定哪些类型最需要高效支持。计算机是否应采用 64 位访问通路，还是用两个周期访问一个双字就已足够？前面已经说明，字节访问需要对齐网络：<!-- source: p0682 -->直接支持字节操作到底有多重要？图 A.11 通过存储器引用考察了被访问的数据类型。

![基准程序按数据大小统计的存储访问分布](/figures/app-a/fig-a-11.png)
{#fig-A.11 .wide .expand num="A.11" caption="基准程序按对象大小统计的数据访问分布。双字在浮点程序中用于双精度浮点数，也用于地址，因为被测计算机使用 64 位地址。在采用 32 位地址的计算机上，64 位地址会换成 32 位地址，因此整数程序中几乎所有双字访问都会变为单字访问。"}

图内术语与数值：Byte＝字节（8 位），Half word＝半字（16 位），Word＝字（32 位），Double word＝双字（64 位）。依次按字节、半字、字、双字排列，浮点程序平均值为 1%、0%、29%、70%；整数程序平均值为 10%、5%、26%、59%。

某些体系结构允许按字节或半字访问寄存器中的对象，但这种访问很少。在这些程序的 VAX 测量中，它不超过寄存器引用的 12%，约占全部操作数访问的 6%。
