我试图将bool值加在一起,比如说:
bool i = 0, j = 0, k = 0;
cout << sizeof(i + j + k) << endl;
结果为4,表示结果转换为'int'值。
我想问一下:这是一个C / C ++标准操作吗?编译器是否始终保证临时值在溢出时转换为更大的类型?谢谢!
感谢您的回答,一个跟进问题:
说,如果我这样做:
unsigned short i = 65535, j = 65535;
cout << sizeof(i + j) << endl;
结果是4.为什么它被提升为'int'?
答案 0 :(得分:18)
导致转换的不是溢出,这是你完全算术的事实。在C ++(和行为源自的C)中,内置类型的基本算术运算符的操作数在进行计算之前会经过一组明确定义的提升。这些规则的基本原则(略微简化)是任何小于int
的类型都会被提升为int
。
您的后续问题具有相同的答案 - 您的short
小于int
,因此在添加之前会将其提升为int
。
This StackOverflow question有几个答案可以更详细地描述促销活动。
答案 1 :(得分:1)
首先,sizeof
并未告诉您结果已转换为int
值。 bool
与[{1}}具有相同的大小是允许的,而且实际上并非罕见。
但是你确实会在这里获得int
,但这与值无关(实际上,类型不能取决于值,因为通常在运行时之前不会知道这些值,而必须确定类型在编译时)。
在添加之前,int
值被提升为bool
,因为int
被定义为整数类型,整数类型小于bool
所有升级为int
。然后,您添加三个int
值(无论您使用的int
值是什么,都不会溢出的操作,因为bool
保证大于3)。