这篇文章说:
如果原始类型的所有值都可以表示为 int,则 较小类型的值将转换为 int;否则,它是 转换为无符号整数
signed/unsigned char
和signed/unsigned short
的所有值都可以表示为int
,那么一个类型什么时候被提升为unsigned int
呢?
short
不能长于int
但在某些平台上,它的大小可能相同。int
和long
也是如此.这意味着,如果"较小"的没有符号,那么"较大"的也必须是无符号的。
这篇文章使用了草率的术语。源类型不必"小于"int
。以下是C++11标准的内容:
除
bool
、char16_t
、char32_t
或wchar_t
以外的整数类型的 prvalue,其整数转换 秩 (4.13) 小于int
int
的秩 如果int
可以表示所有 源类型的值;否则,可以将源 PRvalue 转换为类型unsigned int
的 PR值。
例如,有些平台上的unsigned short
和int
都是16位长。然而,根据定义,unsigned short
的等级低于int
,需要整体晋升。在这种情况下,int
不能表示 unsigned short
类型的所有值,因此提升是 unsigned int
。
编辑:C99有类似的措辞:
可以在表达式中使用以下内容,无论
int
或unsigned int
用于:整数
- 类型整数转换排名较低的对象或表达式 大于或等于
int
和unsigned int
的等级。- 类型
_Bool
、int
、signed int
或unsigned int
的位域。如果
int
可以表示原始类型的所有值,则该值将转换为int
; 否则,它将转换为unsigned int
。这些称为整数 促销。48) 所有其他类型均因整数促销而保持不变。
好吧,如果sizeof(char) == sizeof(int),那么无符号char应该被提升为无符号的int