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

时间:2018-01-30 13:49:46

标签: c c99 unsigned signed stdint

我在Nutshell中读C并发现了这个:

  

"如果定义了可选的签名类型(没有前缀u),那么   相应的无符号类型(带有初始u)是必需的,反之亦然。"

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

1 个答案:

答案 0 :(得分: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指定)   存储(包括标志信息)并具有相同的对齐要求。