对于每种有符号整数类型,标准均保证存在相应无符号整数类型。 6.2.5 p6
:
对于每个有符号整数类型,都有一个对应的(但 不同的)无符号整数类型(用关键字
unsigned
指定) )使用相同的存储量(包括标志信息) 并具有相同的对齐要求。
用关键字unsigned
指定的短语使我感到困惑,因此我咨询了该标准的较早版本,以了解该标准是否存在。 C89/3.2.1.5提供了完全相同的措辞:
对于每个有符号整数类型,都有一个对应的(但 不同的)无符号整数类型(用关键字指定)
unsigned
)使用相同数量的存储空间(包括符号) 信息),并且具有相同的对齐要求。
现在考虑uintptr_t
和intptr_t
; uintmax_t
和intmax_t
;等等...(这是可选的,但如果实现定义了这些类型)。
问题:根据我上面引用的定义,uintptr_t
不是intptr_t
的相应无符号整数类型,uintmax_t
不是相应的无符号整数类型intmax_t
?
我很担心,因为通常的算术转换使用术语6.3.1.8 p1
:
否则,两个操作数都将转换为无符号整数类型 对应于带符号整数类型的操作数的类型
因此,我试图理解应用于uintptr_t
和intptr_t
的常规算术转换的语义。
答案 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_t
和uintN_t
固定宽度类型直到C99才引入,因此这可能就是您所引用的标准缺少有关它们的信息的原因。