13

I tried to add bool value together, say:

bool i = 0, j = 0, k = 0;
cout << sizeof(i + j + k) << endl;

The result is 4, which means, the result is converted to a 'int' value.

I want to ask: Is this a C/C++ standard operation? does the compiler always guarantee that the temporary value to be converted to a larger type if it overflows? Thanks!

Thanks for the answers, one follow up question: say, if I do: unsigned short i = 65535, j = 65535; cout << sizeof(i + j) << endl; The result is 4. Why it's been promoted to 'int'?

4

2 回答 2

23

导致转换的不是溢出,而是您进行算术运算的事实。在 C++(以及行为起源的 C)中,内置类型的基本算术运算符的操作数在进行计算之前会经过一组明确定义的提升。这些规则中最基本的(有些简化)是任何小于 an 的类型int都被提升为int.

您的后续问题具有相同的答案 - yourshort小于 an ,因此在添加之前int它被提升为 an 。int

这个 StackOverflow 问题有几个更详细地描述促销活动的答案。

于 2013-06-18T21:31:22.540 回答
1

首先,sizeof不会告诉您结果已转换为int值。它bool的大小与int.

但是,您确实会在int这里得到一个,但这与值无关(实际上,类型不能依赖于值,因为通常这些值要到运行时才能知道,而类型必须在编译时确定)。

发生的情况是,在添加之前,bool值被提升为,int因为bool被定义为整数类型,小于int 所有的整数类型被提升为int。然后添加三个int值(无论使用什么值都不会溢出的操作bool,因为INT_MAX保证大于 3)。

于 2013-06-18T21:36:47.393 回答