首页 文章

从理论上讲,实现是否可以将unsigned int提升为int?

提问于
浏览
4

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

6.2.5-9有符号整数类型的非负值范围是相应无符号整数类型的子范围,每种类型中相同值的表示形式相同 . 6.2.6.2-2对于有符号整数类型,对象表示的位应分为三组:值位,填充位和符号位 . 不需要任何填充位;应该只有一个符号位 . 作为值位的每个位应具有与相应无符号类型的对象表示中的相同位相同的值(如果有符号类型中有M个值位且无符号类型中有N,则M≤N) .

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

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

1 回答

  • 4

    (可能)签名类型可以表示相应的无符号类型可表示的所有数字 . 例如,如果使用31个值位和1个填充位表示unsigned int类型,则使用31个值位和无填充位表示signed int . 是否允许实施?

    该标准在_2585877中确定:

    否则,将对两个操作数执行整数提升 . 然后将以下规则应用于提升的操作数:如果两个操作数具有相同的类型,则不需要进一步转换 . 否则,如果两个操作数都具有有符号整数类型或两者都具有无符号整数类型,则具有较小整数转换等级类型的操作数将转换为具有更高等级的操作数的类型 . 否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型 .

    由于 intunsigned int 具有相同的等级( 6.3.1.1 Boolean, characters, and integers ), int 将转换为 unsigned int ,但不是相反:

    • 任何无符号整数类型的等级应等于相应的有符号整数类型的等级(如果有) .

    后缀为 u 的整数常量始终是无符号的(请参阅 6.4.4.1 Integer constants 中的表) .

    6.3.1.1 Boolean, characters, and integers 第2条也告诉我们:

    可以在任何可以使用int或unsigned int的表达式中使用以下内容: - 具有整数类型的对象或表达式,其整数转换等级小于int和unsigned int的等级 . - _Bool,int,signed int或unsigned int类型的位字段 . 如果int可以表示原始类型的所有值,则该值将转换为int;否则,它将转换为unsigned int . 这些被称为整数促销 . 整数促销不会更改所有其他类型 .

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

    EDIT6.3.1.1 Boolean, characters, and integers 第2条内容如下:

    • 具有整数类型的对象或表达式,其整数转换等级小于int和unsigned int的等级 .

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

    • 具有整数类型的对象或表达式,其整数转换等级小于或等于int和unsigned int的等级 .

    (WG14 / N1256委员会草案 - 2007年第7章ISO / IEC 9899:TC3)

    • 具有整数类型(int或unsigned int除外)的对象或表达式,其整数转换等级小于或等于int和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]

    如果int可以表示源的所有值,则整数转换等级(4.13)小于int的等级的除bool,char16_t,char32_t或wchar_t之外的整数类型的prvalue可以转换为int类型的prvalue类型;否则,源prvalue可以转换到unsigned int类型的prvalue .

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

相关问题