根据C99标准中的以下两个条款:
6.2.5-9
有符号整数类型的非负值范围是子范围 相应的无符号整数类型,以及表示形式 每种类型的相同值都是相同的。
6.2.6.2-2
对于有符号整数类型,对象表示的位应为 分为三组:值位,填充位和符号 位。不需要任何填充位;应该只有一个 标志位。作为值位的每个位应具有相同的值 相应的对象表示中的相同位 无符号类型(如果有符号类型中有M个值位且N in 无符号类型,则M≤N)。
(可能)签名类型可以表示相应的无符号类型可表示的所有数字。例如,如果使用31个值位和1个填充位表示unsigned int
类型,则使用31个值位和无填充位表示signed int。
是否允许实施?如果是,这是否意味着在这种情况下unsigned int
将被提升为int
(因为两种类型都具有相同的转换排名,int
可以表示{{1}的所有值代表)?
答案 0 :(得分:4)
(可能)签名类型可以表示相应的无符号类型可表示的所有数字。例如,如果使用31个值位和1个填充位表示unsigned int类型,则使用31个值位和无填充位表示signed int。是否允许实施?
标准在6.3.1.8 Usual arithmetic conversions
中确定:
否则,将对两个操作数执行整数提升。那么 以下规则适用于提升的操作数: 如果两个操作数具有相同的类型,则不需要进一步转换。
否则,如果两个操作数都有有符号整数类型或两者都有无符号 整数类型,具有较小整数转换等级类型的操作数是 转换为具有更高等级的操作数的类型。
否则,如果具有无符号整数类型的操作数的等级大于或等于 等于另一个操作数的类型的等级,然后是操作数 有符号整数类型转换为带有unsigned的操作数的类型 整数类型。
由于int
和unsigned int
的排名相同(6.3.1.1 Boolean, characters, and integers
),int
会转换为unsigned int
,但不是相反:< / p>
- 任何无符号整数类型的等级应等于相应的等级 有符号整数类型,如果有的话。
以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
,除非您通过强制转换或转让明确要求。
编辑:6.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的等级中间体
(N1548委员会草案 - 2010年12月2日ISO / IEC 9899:201x,
N1570委员会草案 - 2011年4月12日ISO / IEC 9899:201x)
只是为了好玩,C ++ 11的4.5 Integral promotions [conv.prom]
:
除bool,char16_t,char32_t或wchar_t之外的整数类型的整数转换的整数转换 如果int可以表示all,则rank(4.13)小于int的rank可以转换为int类型的prvalue 源类型的值;否则,源prvalue可以转换为unsigned类型的prvalue 中间体
(N3242 = 11-0012,
N3337日期:2012-01-16,
国际标准ISO / IEC 14882第三版2011-09-01)