#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)。但是当我不输入它时,它没有输出并且没有错误。为什么会这样?
答案 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)