【问题标题】:Signed integer type and its corresponding unsigned integer type有符号整数类型及其对应的无符号整数类型
【发布时间】:2020-04-15 16:55:06
【问题描述】:

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

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

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

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

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

问题:根据我上面引用的定义,uintptr_t 不是intptr_t 对应的无符号整数类型,uintmax_tintmax_t 对应的无符号整数类型吗?

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

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

所以我试图理解应用于uintptr_tintptr_t 的常用算术转换的语义。

【问题讨论】:

  • 这些是 typedef,不是实际的类型。
  • @Barmar 最有可能,但标准 AFAIK 没有定义。

标签: c integer language-lawyer conversion-rank


【解决方案1】:

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

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

7.20.1(1) 说:

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

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

【讨论】:

  • 我们不能对<stddef.h>中定义的类型做同样的假设吗?
  • 我的意思是size_t, ptrdiff_ttypedefs。
  • 是的,虽然我看不出它与这个问题有什么关系。这些不会同时出现在签名和未签名的变体中。
【解决方案2】:

标准“7.20.1.5 最大宽度整数类型”中的标题和标题下的描述,其中两种类型成对描述,假设uintmax_t 被定义为对应于类型@987654322 的无符号类型@。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-12-26
      • 2010-09-09
      • 2023-04-02
      • 2012-07-31
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      相关资源
      最近更新 更多