gpt4 book ai didi

c - 理论上是否有可能实现将 unsigned int 提升为 int?

转载 作者:太空狗 更新时间:2023-10-29 15:33:08 24 4
gpt4 key购买 nike

根据 C99 标准中的以下两个条款:

6.2.5-9

The range of nonnegative values of a signed integer type is a subrange of the corresponding unsigned integer type, and the representation of the same value in each type is the same.

6.2.6.2-2

For signed integer types, the bits of the object representation shall be divided into three groups: value bits, padding bits, and the sign bit. There need not be any padding bits; there shall be exactly one sign bit. Each bit that is a value bit shall have the same value as the same bit in the object representation of the corresponding unsigned type (if there are M value bits in the signed type and N in the unsigned type, then M ≤ N ).

有符号类型(可能)可以表示相应无符号类型可表示的所有数字。例如,如果 unsigned int 类型使用 31 个值位和 1 个填充位表示,而 signed int 使用 31 个值位且无填充位表示。

是否允许实现这样做?如果是,这是否意味着在这种情况下 unsigned int 将被提升为 int(因为两种类型具有相同的转换等级和 int 可以代表unsigned int 代表的所有值)?

最佳答案

It is (probably) possible for a signed type to represent all numbers representable by the corresponding unsigned type. For example, if the unsigned int type is represented using 31 value bits and 1 padding bit and the signed int is represented using 31 value bits and no padding bits. Is an implementation allowed to do so?

标准在6.3.1.8 普通算术转换中建立:

Otherwise, the integer promotions are performed on both operands. Then the following rules are applied to the promoted operands: If both operands have the same type, then no further conversion is needed.

Otherwise, if both operands have signed integer types or both have unsigned integer types, the operand with the type of lesser integer conversion rank is converted to the type of the operand with greater rank.

Otherwise, if the operand that has unsigned integer type has rank greater or equal to the rank of the type of the other operand, then the operand with signed integer type is converted to the type of the operand with unsigned integer type.

由于 intunsigned int 具有相同的等级(6.3.1.1 bool 、字符和整数),int 将转换为 unsigned int,但反之则不然:

— The rank of any unsigned integer type shall equal the rank of the corresponding signed integer type, if any.

u 为后缀的整数常量始终是无符号的(参见6.4.4.1 整数常量 中的表格)。

6.3.1.1 bool 值、字符和整数第 2 条还告诉我们:

The following may be used in an expression wherever an int or unsigned int may be used:

— An object or expression with an integer type whose integer conversion rank is less than the rank of int and unsigned int.

— A bit-field of type _Bool, int, signed int, or unsigned int.

If an int can represent all values of the original type, the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions. All other types are unchanged by the integer promotions.

所以,不,实现不能合法地将 unsigned int 转换为 int,除非您通过强制转换或赋值明确要求。

编辑:6.3.1.1 bool 值、字符和整数 的第 2 条内容如下:

— An object or expression with an integer type whose integer conversion rank is less than the rank of int and unsigned int.

(国际标准 ISO/IEC 9899 第二版 1999-12-01)

— An object or expression with an integer type whose integer conversion rank is less than or equal to the rank of int and unsigned int.

(WG14/N1256 委员会草案 — 2007 年 9 月 7 日 ISO/IEC 9899:TC3)

— An object or expression with an integer type (other than int or unsigned int) whose integer conversion rank is less than or equal to the rank of int and unsigned int.

(N1548 委员会草案 — 2010 年 12 月 2 日 ISO/IEC 9899:201x,
N1570 委员会草案 - 2011 年 4 月 12 日 ISO/IEC 9899:201x)

为了好玩,C++11 的 4.5 Integral promotions [conv.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.

(N3242=11-0012,
N3337 日期:2012-01-16,
国际标准 ISO/IEC 14882 第三版 2011-09-01)

关于c - 理论上是否有可能实现将 unsigned int 提升为 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15701588/

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