首页 > 解决方案 > 有符号整数类型及其对应的无符号整数类型

问题描述

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

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

用关键字指定unsigned的短语让我感到困惑,我查阅了标准的早期版本以了解它是否出现在那里。C89/3.2.1.5提供了完全相同的措辞:

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

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

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

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

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

所以我试图理解通常的算术转换的语义,比如uintptr_tintptr_t.

标签: cintegerlanguage-lawyerconversion-rank

解决方案


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

对于实现提供的此处描述的每种类型,261)<stdint.h>应声明 typedef 名称并定义相关的宏。

7.20.1(1) 说:

当 typedef 名称仅在不存在或存在初始 u 时有所不同时,它们应表示相应的有符号和无符号类型,如 6.2.5 中所述;

所以我相信这些都需要遵循与基本整数类型相同的默认转换规则。


推荐阅读