将bool转换为位域中的位

时间:2018-06-19 09:13:54

标签: c++

我有一个位域:

struct MyBitfield {
  unsigned char field1: 1;
  unsigned char field2: 1;
};

这些位域参数为1位宽并表示布尔值。我想知道用bools初始化它是否有效,如下所示

MyBitfield my_bitfield = {true, false};

我的问题是这种行为是否定义明确。 IIUC,false始终求值为0,但true可以求值为任何非零整数。如果它恰好评估为LSB为0的整数,它是否会被转换为位0并评估为false或语言是否保证它将始终被转换为1mysql-connector-java-8.0.11.jar

3 个答案:

答案 0 :(得分:1)

简短回答:是的,语言保证将始终将其强制转换为第1位。

答案很长:

这里有一些很好的信息: Can I assume (bool)true == (int)1 for any C++ compiler?

  

如果源类型为bool,则值false将转换为零和   值true将转换为一个。

http://en.cppreference.com/w/cpp/language/bool_literal

#include <iostream>

int main()
{
  std::cout << std::boolalpha
            << true << '\n'
            << false << '\n'
            << std::noboolalpha
            << true << '\n'
            << false << '\n';
}

输出:

true
false
1
0

所以是的,语言保证它总是被转换为第1位。

答案 1 :(得分:1)

cppreference上,我们可以阅读:

  

如果源类型为bool,则将值false转换为零,将值true转换为目标类型的值(请注意,如果目标类型为int,则为整数提升,而不是整数转化率)。

您的代码没问题。

答案 2 :(得分:0)

从目前的草案n4750

<强>§12.2.4/ 3

  

[...] bool值可以成功存储在任何非零大小的位域中。 [...]

也适用于C ++ 03 §9.6/ 3