这article说:
如果原始类型的所有值都可以表示为int,则 small类型的值转换为int;否则就是 转换为unsigned int
signed/unsigned char
和signed/unsigned short
的所有值都可以表示为int
,那么什么时候类型会被提升为unsigned int
?
答案 0 :(得分:2)
short
不能超过int
,但在某些平台上,它的大小可能相同。 int
和long
也是如此。这意味着,如果"较小"一个是未签名的,"更大"一定也必须。
答案 1 :(得分:2)
这篇文章使用了草率的术语。源类型不必比int
“更小”。这是C ++ 11标准所说的:
除
bool
,char16_t
,char32_t
或wchar_t
整数转换以外的整数类型的prvalue 如果int
可以代表所有int
,则排名(4.13)小于int
的排名可以转换为unsigned int
类型的公开值 源类型的值;否则,源prvalue可以转换为unsigned short
类型的prvalue。
有些平台,例如int
和unsigned short
都是16位长。尽管如此,根据定义,int
排名低于int
,并且需要进行整体推广。在这种情况下,unsigned short
无法代表unsigned int
类型的所有值,因此促销是int
。
编辑:C99有类似的措辞:
以下内容可用于
unsigned int
或int
的任何地方 使用:
- 具有整数转换级别较小的整数类型的对象或表达式 大于或等于
unsigned int
和_Bool
的等级。- 类型为
int
,signed int
,unsigned int
或int
的位字段。如果
int
可以表示原始类型的所有值,则该值将转换为unsigned int
; 否则,它将转换为{{1}}。这些被称为整数 促销活动。 48)所有其他类型的整数促销都没有改变。
答案 2 :(得分:0)
好吧,如果sizeof(char)== sizeof(int),那么unsigned char应该被提升为unsigned int