2013-03-29 28 views
4

根据来自C99标准以下两项条文:理论上实现是否可以将unsigned int提升为int?

6.2.5-9

带符号的整数类型的非负的值的范围是相应的无符号整数类型的子范围 ,并且 的表示在每种类型中相同的值是相同的。

6.2.6.2-2

对于有符号的整数类型,所述对象的表示的比特必须 可以分为三组:值的比特,填充比特,和符号比特 。不需要任何填充位;应该只有一个 符号位。每一位是一个值位,其值应与对应的 无符号类型的对象表示中的相同位的值相同(如果在有符号类型中有M个值位,而在无符号类型中有N个,则M≤N )。

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

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

+1

你不能得到一个夸脱成品脱瓶 - 这是一个成语,但是是真的 –

回答

4

它可能(可能)有符号类型表示所有可用相应的无符号类型表示的数字。例如,如果使用31个值位和1个填充位表示无符号整数类型,并且使用31个值位和无填充位表示带符号整数。是否允许这样做?

该标准建立在6.3.1.8 Usual arithmetic conversions

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

否则,如果具有无符号整数类型的操作数的秩大于或 等于另一个操作数的类型的秩,然后用 符号整型操作数被转换为操作数的类型与无符号 整数类型。

由于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 intint,除非你通过铸造或转让的方式要求明确。

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)

+0

整数的促销活动不会先到? “整数升级在两个操作数上执行**然后**将下列规则应用于升级的操作数:” – Alexandros

+0

但这些升级适用于级别小于“int”的类型,适用于各种“short”和“ char'和位域。它们不适用于'unsigned int'。见'6.3.1.1布尔,字符和整数'的子句2。 –

+0

整数转换等级不必严格小于“整型转换等级小于**或**等于**到整型和无符号整型等级的整数类型的对象或表达式”。 – Alexandros