为什么在C语言中每个有符号的int类型都必须有相应的unsigned int类型?

edd*_*dge 8 c unsigned signed c99 stdint

我在Nutshell中读C并发现:

"如果定义了可选的带符号类型(没有前缀u),则需要相应的无符号类型(带有初始u),反之亦然."

该段落是关于具有精确宽度(C99)的整数类型.

Lun*_*din 5

因为C的原始数据类型带有有符号和无符号版本.从C99的基本原理来看,他们解释了inttypes/stdint对这类型的需求,C99理论基础V5.10 7.8:

C89指定该语言应该支持四种有符号和无符号整数数据类型,char,short,int和long,但除了int之外,对它们的大小要求很少,而且short至少为16位,并且长度至少与int且不小于32位.对于16位系统,大多数实现分别将8,16,16和32位分配给char,short,int和long.对于32位系统,通常的做法是为这些类型分配8位,16位,32位和32位.int大小的这种差异可能会为从一个系统迁移到另一个系统的用户造成一些问题,这些用户将不同的大小分配给整数类型,因为标准C的整数提升规则可能会意外地产生静默更改.随着64位系统的引入,定义扩展整数类型的需求也在增加.

其目的<inttypes.h>是提供一组整数类型,其定义在不同的机器上是一致的,并且独立于操作系统和其他实现特性.它通过typedef定义了各种大小的整数类型.实现可以自由地将它们键入为标准C整数类型或它们支持的扩展.一致地使用此标头将极大地提高跨平台的用户程序的可移植性.

目的是实现inttypes/stdin可以执行typedef.因此,需要一种与每种支持的基元数据类型相对应的固定宽度类型.

至于为什么C首先签署了类型,这只是因为CPU:s支持有符号和无符号数字运算.但是,因为我们希望使用整数类型来表达存储的原始二进制数据:类型unsigned char/ uint8_t是C语言,相当于可以包含任何内容的原始数据字节.(这就是字符类型不能包含任何陷阱表示等的原因)

从C99标准本身我们可以找到与您的书C99 6.2.5/6类似的文本:

对于每个有符号整数类型,存在相应的(但不同的)无符号整数类型(使用关键字unsigned指定),它使用相同数量的存储(包括符号信息)并具有相同的对齐要求.