根据 C99,signed int
或unsigned int
表示中可能有填充位。所以我想知道还有没有这样过时的东西的实现?
3 回答
来自新 C 标准:
在某些 Cray 处理器上,short 类型具有 32 位精度,但保存在 64 位的存储空间中。Unisys A 系列无符号整数类型包含一个填充位,该位在有符号整数表示中被视为符号位。
...
Harris/6 计算机使用两个连续的 int 类型来表示 long 类型。这意味着必须忽略其中一个整数的符号位;它被视为填充位。int 类型的值表示为 24 位宽,而 long 的值表示为 47 位和一个填充位。
引用 C99 基本原理 ( PDF ) 部分 6.2.6.2 §20:
填充位是无符号整数类型的用户可访问的。例如,假设一台机器使用一对 16 位的 short(每个都有自己的符号位)组成一个 32 位,并且在这个 32 位中使用时忽略
int
低位的符号位。然后,作为 32-bit ,在确定 32-bit 的值 20 时会忽略一个填充位(在 32 位的中间)。但是,如果这个 32 位项被视为 32 位,则该填充位对用户程序是可见的。C 委员会被告知有一台机器以这种方式工作,这就是在 C99 中添加填充位的原因之一。short
int
signed int
signed int
unsigned int
所以至少这样的事情确实存在。
至于今天仍然存在的奇怪架构,首选示例是具有奇怪数据格式的 UNIVAC 1100/2200 系列。
虽然它不使用整数填充,但查看他们的 C 编译器手册 ( PDF ) 仍然很有启发性:
Table 4–4. Size and Range of Unsigned Integer Types
Type Size Range
unsigned short int 18 bits 0 to (2^18)–1
unsigned short
unsigned int 36 bits 0 to (2^36)–2 (see the following note)
unsigned
unsigned long int 36 bits 0 to (2^36)–2 (see the following note)
unsigned long
第二卷 ( PDF ) 解释了如何使用CONFORMANCE/TWOSARITH
编译器关键字来控制负零的解释:这会将无符号整数类型的范围调整为预期的 (2^36)-1,但会对无符号算术产生性能损失。
MSP430X架构(德州仪器的微控制器架构)是一个 16 位架构 (MSP430),它扩展为具有 20 位寄存器的 20 位地址空间。该架构仍然是字节寻址的,一个字节有八位。指令通常可以对 8、16 和 20 位的数量进行操作。
在这种架构上,编译器可能会选择制作int
20 位类型。由于 20 不是 8 的倍数,因此在内存中存储此类型时必须添加 4 或 12 位填充。