它可能(可能)有符号类型表示所有可用相应的无符号类型表示的数字。例如,如果使用31个值位和1个填充位表示无符号整数类型,并且使用31个值位和无填充位表示带符号整数。是否允许这样做?
该标准建立在6.3.1.8 Usual arithmetic conversions
:
否则,整数优惠是在两个操作数执行。然后将 以下规则应用于提升的操作数: 如果两个操作数具有相同类型,则不需要进一步转换。否则,如果两个操作数具有有符号整数类型或两者都具有无符号整数类型 ,则类型为较小整数转换等级的操作数为 转换为具有较高等级的操作数的类型。
否则,如果具有无符号整数类型的操作数的秩大于或 等于另一个操作数的类型的秩,然后用 符号整型操作数被转换为操作数的类型与无符号 整数类型。
由于int
和unsigned 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
,除非你通过铸造或转让的方式要求明确。
EDIT:的6.3.1.1 Boolean, characters, and integers
第2读作:
- 一个对象或表达的整数类型,其整数转换秩为int和unsigned int的少 比秩。
(国际标准ISO/IEC 9899第二版1999-12-01)
- 一个对象或表达的整数类型,其整数转换秩小于小于或等于秩int和unsigned int。
(WG14/N1256委员会草案 - Septermber 7,2007年ISO/IEC 9899:TC3)
- (比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]
:
比BOOL,char16_t,char32_t,或wchar_t的其整转换 秩(4.13)以外的整数类型的prvalue小于INT的秩可以被转换成一个int类型的prvalue如果int可以代表全部 的源类型的值;否则,源prvalue可以转换为类型为unsigned int的prvalue。
(N3242 = 11-0012,
N3337日期:2012-01-16,
国际标准ISO/IEC 14882第三版2011-09-01)
你不能得到一个夸脱成品脱瓶 - 这是一个成语,但是是真的 –