11

根据 C99,signed intunsigned int表示中可能有填充位。所以我想知道还有没有这样过时的东西的实现?

4

3 回答 3

14

来自新 C 标准

在某些 Cray 处理器上,short 类型具有 32 位精度,但保存在 64 位的存储空间中。Unisys A 系列无符号整数类型包含一个填充位,该位在有符号整数表示中被视为符号位。

...

Harris/6 计算机使用两个连续的 int 类型来表示 long 类型。这意味着必须忽略其中一个整数的符号位;它被视为填充位。int 类型的值表示为 24 位宽,而 long 的值表示为 47 位和一个填充位。

于 2013-01-02T12:03:37.527 回答
9

引用 C99 基本原理 ( PDF ) 部分 6.2.6.2 §20:

填充位是无符号整数类型的用户可访问的。例如,假设一台机器使用一对 16 位的 short(每个都有自己的符号位)组成一个 32 位,并且在这个 32 位中使用时忽略int低位的符号位。然后,作为 32-bit ,在确定 32-bit 的值 20 时会忽略一个填充位(在 32 位的中间)。但是,如果这个 32 位项被视为 32 位,则该填充位对用户程序是可见的。C 委员会被告知有一台机器以这种方式工作,这就是在 C99 中添加填充位的原因之一。shortintsigned intsigned intunsigned 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,但会对无符号算术产生性能损失。

于 2013-01-02T11:48:43.483 回答
3

MSP430X架构(德州仪器的微控制器架构)是一个 16 位架构 (MSP430),它扩展为具有 20 位寄存器的 20 位地址空间。该架构仍然是字节寻址的,一个字节有八位。指令通常可以对 8、16 和 20 位的数量进行操作。

在这种架构上,编译器可能会选择制作int20 位类型。由于 20 不是 8 的倍数,因此在内存中存储此类型时必须添加 4 或 12 位填充。

于 2015-07-10T06:50:17.873 回答