根据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 回答
该标准在_2585877中确定:
由于
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条也告诉我们:所以,不,实现不能合法地将
unsigned int
转换为int
,除非您通过强制转换或赋值明确要求 .EDIT :
6.3.1.1 Boolean, characters, and integers
第2条内容如下:(国际标准ISO / IEC 9899第二版1999-12-01)
(WG14 / N1256委员会草案 - 2007年第7章ISO / IEC 9899:TC3)
(N1548委员会草案 - 2010年12月2日ISO / IEC 9899:201x,
N1570委员会草案 - 2011年4月12日ISO / IEC 9899:201x)
只是为了好玩,C 11的
4.5 Integral promotions [conv.prom]
:(N3242 = 11-0012,
N3337日期:2012-01-16,
国际标准ISO / IEC 14882第三版2011-09-01)