【问题标题】:adding two bool values in c/c++在 C/C++ 中添加两个布尔值
【发布时间】:2013-06-18 21:27:55
【问题描述】:

我尝试将 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'?

【问题讨论】:

  • int 不是比 bool 更大的类型
  • 编译器是否总是保证临时值溢出时转换为更大的类型?不,在请求强制转换之前,它永远不会将值转换为更大的类型。
  • @aaronman:在大多数实现中,sizeof(bool) < sizeof(int) 被许多人称为 int 是比bool 更大的类型[更多位]
  • @DavidRodríguez-dribeas,我想你的意思是<
  • @CarlNorum: 哈哈...是的,我的意思是<(我已经在评论中更正了原来的>

标签: c++


【解决方案1】:

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

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

This StackOverflow question 有几个回答更详细地描述了促销活动。

【讨论】:

  • 我没说是吧?我想我可以在我的答案前加上“如果有转换”。
  • STL 也有关于这个主题的精彩视频。核心 C++ 7。
【解决方案2】:

首先,sizeof 不会告诉您结果已转换为 int 值。 boolint 具有相同的大小是允许的,而且确实很常见。

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

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

【讨论】:

  • 是的,如果算上手表和无数其他嵌入式 8 位微控制器。我认为在我见过的所有现代编译器和平台上它都是一个字节。所以 bool 只能在 8 位平台上是 int 的大小。
  • 即使在 8 位微机上,int 也必须至少为 16 位。我猜即使在那里它们的大小也不一样。
  • @ddriver:重点不是int 可能是8 位(它不能),而是bool 可能大于一个字节。这不仅仅是一个理论问题:stackoverflow.com/a/6935286/1032073
猜你喜欢
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2011-12-01
相关资源
最近更新 更多