The New C Standard: 在一些Cray处理器上,类型short具有32位精度,但存储在64位中。Unisys A系列无符号整数类型包含一个填充位,该填充位在有符号整数表示中被视为符号位。 ... Harris/6计算机使用两个连续的int类型来表示long类型。这意味着其中一个int的符号位必须被忽略;则将其视为填充位。int类型的值表示是24位宽,long类型的值表示是47位,带有一个填充位。
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
3条答案
按热度按时间cidc1ykv1#
The New C Standard:
在一些Cray处理器上,类型short具有32位精度,但存储在64位中。Unisys A系列无符号整数类型包含一个填充位,该填充位在有符号整数表示中被视为符号位。
...
Harris/6计算机使用两个连续的int类型来表示long类型。这意味着其中一个int的符号位必须被忽略;则将其视为填充位。int类型的值表示是24位宽,long类型的值表示是47位,带有一个填充位。
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)仍然是有益的:
字符串
第二卷(PDF)解释了如何使用
CONFORMANCE/TWOSARITH
编译器关键字来控制负零的解释:这会将无符号整数类型的范围调整为预期的(2^36)-1,但会对无符号算术造成性能损失。6l7fqoea3#
MSP430X架构(来自Texas Instruments的用于微控制器的架构)是扩展到具有20位寄存器的20位地址空间的16位架构(MSP430)。该体系结构仍然是字节寻址的,一个字节具有8位。指令通常可以在8、16和20位的数量上操作。
在这种体系结构上,编译器可能会选择将
int
设置为20位类型。由于20不是8的倍数,因此当在存储器中存储这种类型时,必须添加4或12位的填充。