位域。为什么没有输出?

Bitfields. Why is there no output?

#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++ 及其最新的编译器。当我将 cast bf.a 键入 int 时,它会给出所需的输出 (7)。但是当我不输入它时,它没有输出也没有错误。为什么会这样?

When i type cast bf.a to int it gives the desired output (7). But when i dont type cast it, it gives no output and gives no errors. Why is it so?

字符(数字 7)已写入控制台。字符 7 是 bell character.


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

生成相同的输出:

cout << '\a';

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


请注意,在这种情况下,char 位域的使用不受标准的限制运行。有关使用 char 位域的问题,请参阅 here

你正在打印值为7的字符。其他人指出这是一个通常不显示的特殊字符。将您的值转换为 int 或其他非字符整数类型以显示值,而不是字符。去看看 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

不支持字符类型位域。

位域声明只支持4个标识符,

  • 无符号整数
  • 有符号整数
  • 整数
  • 布尔值

Source