是否有任何现有的C实现在(无)符号整数表示中具有填充位?

9nvpjoqh  于 2023-08-03  发布在  其他
关注(0)|答案(3)|浏览(97)

根据C99,在signed intunsigned int表示中可能存在填充位。所以我想知道是否仍然有任何实现有这样的过时的东西?

cidc1ykv

cidc1ykv1#

The New C Standard
在一些Cray处理器上,类型short具有32位精度,但存储在64位中。Unisys A系列无符号整数类型包含一个填充位,该填充位在有符号整数表示中被视为符号位。
...
Harris/6计算机使用两个连续的int类型来表示long类型。这意味着其中一个int的符号位必须被忽略;则将其视为填充位。int类型的值表示是24位宽,long类型的值表示是47位,带有一个填充位。

hmae6n7t

hmae6n7t2#

引用C99原理(PDF)部分6.2.6.2 §20:
填充位在无符号整数类型中是用户可访问的。例如,假设一台机器使用一对16位短(每个短都有自己的符号位)来组成一个32位int,当在这个32位int中使用时,较低的short的符号位被忽略。然后,作为32位signed int,存在在确定32位signed int的值20时被忽略的填充位(在32位的中间)。但是,如果这个32位项被视为32位unsigned int,则该填充位对用户的程序是可见的。**C委员会被告知有一台机器是这样工作的,这就是C99添加填充位的原因之一。
这样的事情,至少是存在的。
至于奇怪的体系结构still around today,最好的例子是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,但会对无符号算术造成性能损失。

6l7fqoea

6l7fqoea3#

MSP430X架构(来自Texas Instruments的用于微控制器的架构)是扩展到具有20位寄存器的20位地址空间的16位架构(MSP430)。该体系结构仍然是字节寻址的,一个字节具有8位。指令通常可以在8、16和20位的数量上操作。
在这种体系结构上,编译器可能会选择将int设置为20位类型。由于20不是8的倍数,因此当在存储器中存储这种类型时,必须添加4或12位的填充。

相关问题