gpt4 book ai didi

c++ - sizeof(short) == sizeof(int) 实现的整数提升

转载 作者:行者123 更新时间:2023-11-30 03:52:32 25 4
gpt4 key购买 nike

背景

我正在研究 C++ 中的整数提升规则,并遇到以下内容(取自 n4296):

4.5.1 [pconv.prom]

A prvalue of an integer type other than bool, char16_t, char32_t, or wchar_t whose integer conversion rank (4.13) is less than the rank of int can be converted to a prvalue of type int if int can represent all the values of the source type; otherwise, the source prvalue can be converted to a prvalue of type unsigned int.

4.13.1.3 [conv.rank]

  • The rank of long long int shall be greater than the rank of long int, which shall be greater than the rank of int, which shall be greater than the rank of short int, which shall be greater than the rank of signed char.

5.10 [expr]

Many binary operators that expect operands of arithmetic or enumeration type cause conversions and yield result types in a similar way. The purpose is to yield a common type, which is also the type of the result. This pattern is called the usual arithmetic conversions , which are defined as follows:

[many points omitted]

  • Otherwise, the integral promotions (4.5) shall be performed on both operands.

[further omissions]

问题

鉴于 short int 的大小和范围可能与 int 的大小和范围相等,似乎没有必要推广 short int在那些情况下为 int。然而,上面没有提到这种异常(exception)。

标准是否要求在这些情况下将 short int 提升为 int(即使实现优化导致生成相同的可执行文件)?

注意/附加问题

我还注意到措辞使用“可以”而不是“应该”,这是故意的吗?

最佳答案

shortint 具有相同的范围和表示形式,这是完全合法的,而且曾经非常普遍;即使在今天,嵌入式系统对两者都使用相同的 16 位表示也并不少见。 C 规范确实包含一些特定于此类实现的语言,因为在此类平台上 unsigned short 提升为 unsigned int 而它提升为 signed int 在后一种类型可以表示 unsigned short 的所有值的平台上。它不会从要求将小于 intunsigned int 的类型提升为其中之一的规则中豁免此类实现,因为这样的豁免不会带来任何好处。

如果在所有情况下对 intunsigned int 的指示提升会产生定义的行为,则该标准允许实现可以以任何它认为合适的方式执行计算,实现的计算产生相同的行为(as-if 规则)。如果类型 intshort 的右值行为无法区分,则意味着实现可以对 short 而不是 执行计算>int 如果它选择这样做。无需向标准豁免 int 大小的 short 类型添加规则,因为 as-if 规则已经足够了。

关于c++ - sizeof(short) == sizeof(int) 实现的整数提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30645436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com