位字段。为什么没有输出?

时间:2017-01-04 22:22:38

标签: c++ visual-c++ bit-fields

#include <iostream>
using namespace std;
struct bitfield
{
    unsigned char a : 3, b : 3;
};

int main()
{
    bitfield bf;
    bf.a = 7;
    cout << bf.a;   
    char c;
    cin >> c;
    return 0;
}

我正在使用VC ++及其最新的编译器。当我将int bf.a类型转换为int时,它会给出所需的输出(7)。但是当我不输入它时,它没有输出并且没有错误。为什么会这样?

3 个答案:

答案 0 :(得分:2)

您正在打印值为7的角色。其他人指出这是一个通常不会显示的特殊字符。将您的值转换为int或其他非char整数类型以显示值,而不是字符。去看the ascii table,你会看到角色7是BEL(铃)。

#include <iostream>
using namespace std;
struct bitfield
{
    unsigned char a : 3, b : 3;
};

int main()
{
    bitfield bf;
    bf.a = 7;
    cout << (int)bf.a; // Added (int) here
    char c;
    cin >> c;
    return 0;
}

编辑1:由于bf.a仅为3位,因此无法将其设置为任何可显示的字符值。如果增加它的大小,则可以显示字符。将其设置为46会给出句点字符。

#include <iostream>
using namespace std;
struct bitfield
{
    unsigned char a : 6, b : 2;
};

int main()
{
    bitfield bf;
    bf.a = 46;
    cout << bf.a;   
    char c;
    cin >> c;
    return 0;
}

编辑2:有关使用位域和char的信息,请参阅This answer

答案 1 :(得分:1)

  

当我将int bf.a输入到int时,它会给出所需的输出(7)。但当   我没有输入它,它没有输出,也没有错误。为什么   所以?

将字符(编号7)写入控制台。字符7是bell character

所以你看不到它,但你可以听到它。或者说,当我运行程序时,我可以在Windows 10上听到通知声音。

使用以下内容生成相同的输出:

cout << '\a';

铃声是可以使用escape sequences引用的一组字符的一部分。

请注意,在这种情况下,标准不保证使用char位域。有关char位域使用的问题,请参阅here

答案 2 :(得分:1)

不支持字符类型位域。

Bitfield声明仅支持4个标识符,

  • unsigned int
  • signed int
  • INT
  • BOOL

Source