有符号整数类型及其对应的无符号整数类型

时间:2019-12-24 16:59:04

标签: c integer language-lawyer conversion-rank

对于每种有符号整数类型,标准均保证存在相应无符号整数类型。 6.2.5 p6

  

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

用关键字unsigned 指定的短语使我感到困惑,因此我咨询了该标准的较早版本,以了解该标准是否存在。 C89/3.2.1.5提供了完全相同的措辞:

  

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

现在考虑uintptr_tintptr_tuintmax_tintmax_t;等等...(这是可选的,但如果实现定义了这些类型)。

问题:根据我上面引用的定义,uintptr_t不是intptr_t的相应无符号整数类型,uintmax_t不是相应的无符号整数类型intmax_t

我很担心,因为通常的算术转换使用术语6.3.1.8 p1

  

否则,两个操作数都将转换为无符号整数类型   对应于带符号整数类型的操作数的类型

因此,我试图理解应用于uintptr_tintptr_t的常规算术转换的语义。

3 个答案:

答案 0 :(得分:3)

根据7.20(4),这些是typedef名称,而不是基础类型。

  

对于实现所提供的本文所述的每种类型,261)<stdint.h>应声明该typedef名称并定义关联的宏。

而7.20.1(1)说:

  

当定义的typedef名称仅在不存在首字母u时有所不同时,它们应表示对应的有符号和无符号类型,如6.2.5中所述;

因此,我认为它们必须遵循与基本整数类型相同的默认转换规则。

答案 1 :(得分:2)

标准“ 7.20.1.5最大宽度整数类型”中的标头以及标头下的描述(其中两种类型成对描述)假定uintmax_t被定义为与该类型相对应的无符号类型intmax_t

答案 2 :(得分:2)

intN_tuintN_t固定宽度类型直到C99才引入,因此这可能就是您所引用的标准缺少有关它们的信息的原因。