タグ付けされた質問 「bit-fields」


6
値をビットフィールドに割り当てても同じ値が返されないのはなぜですか?
この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"); } CとC ++の両方で、コードの出力は予想外です。 無効になっています !! あの投稿には「サインビット」に関する説明が載っていますが、どうやって設定したのか、そのまま反映されないのか分かりません。 誰かがより詳細な説明をすることはできますか? 注:両方のタグc & C ++それらの標準はビットフィールドを記述するためにわずかに異なるため、必須です。C仕様およびC ++仕様の回答を参照してください。

11
C#のビットフィールド
私はディスクにデータを入力して書き込む必要がある構造を持っています(実際にはいくつか)。 例は次のとおりです。 byte-6 bit0 - original_or_copy bit1 - copyright bit2 - data_alignment_indicator bit3 - PES_priority bit4-bit5 - PES_scrambling control. bit6-bit7 - reserved CIでは、次のようなことを行う可能性があります。 struct PESHeader { unsigned reserved:2; unsigned scrambling_control:2; unsigned priority:1; unsigned data_alignment_indicator:1; unsigned copyright:1; unsigned original_or_copy:1; }; 構造体の逆参照ドット演算子を使用してビットにアクセスできるようにするC#でこれを行う方法はありますか? いくつかの構造体では、アクセサ関数にラップされたビットシフトを実行できます。 このように処理する構造がたくさんあるので、読みやすく、書きやすいものを探しています。
80 c#  bit-fields 

3
異なるコンパイラでのC ++とCの間の符号なしビットフィールド整数式の一貫性のない切り捨て
編集2: 以前にC ++ソースファイルに存在していた関数がそのままCファイルに移動され、誤った結果が返され始めたときに、奇妙なテストエラーをデバッグしていました。以下のMVEにより、GCCでの問題を再現できます。しかし、気まぐれでClangを使用して(そして後でVSを使用して)例をコンパイルすると、異なる結果が得られました!これをコンパイラの1つのバグとして扱うのか、CまたはC ++標準で許可されている未定義の結果の明示として扱うのか、私にはわかりません。奇妙なことに、どのコンパイラーも式に関する警告を出しませんでした。 犯人はこの表現です: ctl.b.p52 << 12; ここでp52は、と入力されuint64_tます。組合の一部でもありcontrol_tます(下記参照)。結果は64ビットに収まるため、シフト操作はデータを失わない。ただし、Cコンパイラを使用している場合、GCCは結果を52ビットに切り捨てることを決定します。C ++コンパイラでは、結果の64ビットがすべて保持されます。 これを説明するために、以下のサンプルプログラムは、同一の本体を持つ2つの関数をコンパイルし、それらの結果を比較します。c_behavior()Cソースファイルとcpp_behavior()C ++ファイルに配置されmain()、比較を行います。 サンプルコードを含むリポジトリ:https : //github.com/grigory-rechistov/c-cpp-bitfields ヘッダーcommon.hは、64ビット幅のビットフィールドと整数の和集合を定義し、2つの関数を宣言します。 #ifndef COMMON_H #define COMMON_H #include <stdint.h> typedef union control { uint64_t q; struct { uint64_t a: 1; uint64_t b: 1; uint64_t c: 1; uint64_t d: 1; uint64_t e: 1; uint64_t f: 1; uint64_t g: …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.