这篇文章说:
如果原始类型的所有值都可以表示为 int,则将较小类型的值转换为 int;否则,将其转换为无符号整数
signed/unsigned char
和的所有值signed/unsigned short
都可以表示为int
,那么什么时候将类型提升为unsigned int
?
Ashort
不能比 an 长,int
但在某些平台上它可能是相同的大小。int
和也是如此long
。这意味着如果“较小”的那个是无符号的,那么“较大的”也必须是无符号的。
这篇文章使用了草率的术语。源类型不必比int
. 以下是 C++11 标准所说的:
如果可以表示源类型的所有值,则可以将除
bool
,char16_t
,之外的整数类型的纯右值char32_t
,或者wchar_t
其整数转换等级(4.13)小于等级的int
纯右值转换为类型的纯右值;否则,源纯右值可以转换为类型的纯右值。int
int
unsigned int
比如说,有些平台的unsigned short
长度int
都是 16 位。然而,排名低于定义,unsigned short
并受到整体提升。在这种情况下,不能代表 type 的所有值,所以提升是 to 。int
int
unsigned short
unsigned int
编辑:C99 有类似的措辞:
以下可以用在表达式中,只要可以使用
int
orunsigned int
:
- 具有整数类型的对象或表达式,其整数转换等级小于或等于 和 的
int
等级unsigned int
。_Bool
,int
,signed int
或类型的位域unsigned int
。如果 an
int
可以表示原始类型的所有值,则将该值转换为int
; 否则,将其转换为unsigned int
. 这些被称为整数促销。48) 整数提升不会改变所有其他类型。
好吧,如果 sizeof(char) == sizeof(int),那么 unsigned char 应该被提升为 unsigned int