[解決済み] ビットフィールドに値を代入しても、同じ値が戻ってこないのはなぜですか?
質問
以下のコードを このQuoraの投稿 :
#include <stdio.h>
struct mystruct { int enabled:1; };
int main()
{
struct mystruct s;
s.enabled = 1;
if(s.enabled == 1)
printf("Is enabled\n"); // --> we think this to be printed
else
printf("Is disabled !!\n");
}
Camp &; C++のどちらにおいても、コードの出力は 予期せぬ ,
無効です!
その投稿に符号ビット関連の説明がありますが、設定したのにそのまま反映されないということがあり得るのか、理解できません。
どなたか、もう少し詳しい説明をお願いします。
注意 : どちらのタグも c &になります。 c++ が必要なのは、ビットフィールドの記述の規格が微妙に異なるためです。の回答を参照してください。 C言語仕様 と C++仕様 .
どのように解決するのですか?
の通りです。
C++規格n4713
と同じように、非常によく似たコード・スニペットが提供されています。使用されている型は
BOOL
(カスタム)ですが、どのようなタイプにも適用できます。
12.2.4
4 のビットフィールドに true または false の値が格納されている場合、そのフィールドは
bool
型のビットフィールドに格納されている場合(1ビットのビットフィールドも含む)、元のbool
の値とビットフィールドの値は等しく比較されなければならない。 列挙子の値が同じ列挙型のビットフィールドに格納され、ビットフィールドのビット数がその列挙型のすべての値を保持するのに十分な大きさであれば の値を保持するのに十分なビット数である場合(10.2)、元の列挙子の値とビットフィールドの値とを等しく比較しなければならない。 の値を等しく比較しなければならない。 . [ 例enum BOOL { FALSE=0, TRUE=1 }; struct A { BOOL b:1; }; A a; void f() { a.b = TRUE; if (a.b == TRUE) // yields true { /* ... */ } }
- 終了例 ]。
一見すると、太字の部分は解釈の余地があるように見えます。しかし、正しい意図は
enum BOOL
から派生した
int
.
enum BOOL : int { FALSE=0, TRUE=1 }; // ***this line
struct mystruct { BOOL enabled:1; };
int main()
{
struct mystruct s;
s.enabled = TRUE;
if(s.enabled == TRUE)
printf("Is enabled\n"); // --> we think this to be printed
else
printf("Is disabled !!\n");
}
上記のコードでは
-Wall -pedantic
:
警告: 'mystruct::enabled' は 'enum BOOL' のすべての値を保持するには小さすぎます。
struct mystruct { BOOL enabled:1; };
出力されるのは
は無効です ! (このとき
enum BOOL : int
)
もし
enum BOOL : int
が単純化され
enum BOOL
とすると、上記の標準パッセージが指定するとおりの出力になります。
が有効であること(
enum BOOL
)
したがって、他の回答がほとんどないように、次のように結論づけることができます。
int
型は、たった 1 ビットのビットフィールドに値 "1" を格納するのに十分な大きさではありません。
関連
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] なぜalloca()の使用はグッドプラクティスとみなされないのでしょうか?
-
[解決済み] なぜC++ STLは "ツリー "コンテナを提供しないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された