2017-01-04 12 views
1
#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++を使用しています。 bf.aをint型にキャストすると、目的の出力が得られます(7)。しかし、私はそれをキャストしないでください、それは出力を提供し、エラーを出すことはありません。それはなぜそうですか?ビットフィールド。なぜ出力はありませんか?

+1

を締結サポート目に見えない文字: 'cout <<(int)bf.a; ' – Raindrop7

答えて

1

私は、bf.aをint型にキャストすると、目的の出力(7)が得られます。しかし、 私はそれをキャストしないでください、それは出力を提供せず、エラーが発生しません。なぜそれは なのですか?

文字(数7)はコンソールに書き込まれました。文字7はbell characterです。


だから、見ることはできませんが、聞くことができます。あるいは、私はプログラムを実行したときにWindows 10で通知音を聞くことができました。

cout << '\a'; 

ベルescape sequencesで参照することができる文字のグループの一部である:

同じ出力を用いて生成されます。この場合にはcharビットフィールドの使用は標準で保証されていないことを


は注意してください。 charビットフィールドの使用に関する質問については、hereを参照してください。

2

値が7のキャラクターを印刷しています。これは通常は表示されない特殊文字であると指摘している人もいます。文字ではなく値を表示するには、値をintまたは別の非char型にキャストします。 the ascii tableを見ると、文字7がベル(ベル)であることがわかります。

#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

文字型のビットフィールドはサポートされていません。

ビットフィールド宣言は、4識別子、

  • unsigned int型
  • は単にの整数値を出力INT
  • INT
  • BOOL

Source

関連する問題