問題タブ [bit-fields]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - GCC、-O2、およびビットフィールド - これはバグですか、それとも機能ですか?
今日、ビット フィールドを使って実験を行っているときに、驚くべき動作を発見しました。説明と単純化のために、ここにプログラム例を示します。
プログラムは意図的に 3 ビットのビットフィールドをオーバーフローさせています。「g++ -O0」を使用してコンパイルした場合の(正しい)出力は次のとおりです。
int にキャストされた 3 ビット フィールド: 7
int にキャストされた 3 ビット フィールド: 0
"g++ -O2" (および -O3) を使用してコンパイルした場合の出力は次のとおりです。
int にキャストされた 3 ビット フィールド: 7
int にキャストされた 3 ビット フィールド: 8
後者の例のアセンブリを確認すると、次のことがわかりました。
実際には数値がオーバーフローしてゼロであるのに、7+1=8 であると仮定して、最適化により「8」が挿入されました。
幸いなことに、私が知る限り、関心のあるコードはオーバーフローしていませんが、この状況は私を怖がらせます。これは既知のバグなのか、機能なのか、それとも予想される動作なのか? これについてgccが正しいと期待できるのはいつですか?
編集 (re: 署名済み/未署名) :
署名なしと宣言されているため、署名なしとして扱われています。int として宣言すると、出力が得られます (O0 を使用):
int にキャストされた 3 ビット フィールド: -1
int にキャストされた 3 ビット フィールド: 0
この場合、-O2 を使用すると、さらに面白いことが起こります。
int にキャストされた 3 ビット フィールド: 7
int にキャストされた 3 ビット フィールド: 8
属性を使用するのは怪しいものであることは認めます。この場合、私が懸念している最適化設定の違いです。
c++ - 構造体または共用体の「unsignedtemp:3」はどういう意味ですか?
重複の可能性:
このC ++コードはどういう意味ですか?
JNAを使用してC構造体をJavaにマップしようとしています。見たことのないものに出くわしました。
定義は次のstruct
とおりです。
いくつかの変数が次のように定義されているのがわかりますがunsigned op_attached:1
、それが何を意味するのかわかりません。これは、この特定の変数に割り当てられるバイト数に影響しますか?
sql-server - Microsoftは3値フィールドを1ビットに格納できますか?
I'm completely ignorant of SQL/databases, but I was chatting with a friend who does a lot of database work about how some databases use a "boolean" field that can take a value of NULL in addition to true and false.
Regarding this, he made a comment along these lines: "To Microsoft's credit, they have never referred to that kind of field as a boolean, they just call it a bit. And it's a true bit - if you have eight or fewer bit fields in a record, it only requires one byte to store them all."
Naturally that seems impossible to me - if the field can hold three values you're not going to fit eight of them into a byte. My friend agreed that it seemed odd, but begged ignorance of the low-level internals and said that so far as he knew, such fields can hold three values when viewed from the SQL side, and it does work out to require a byte of storage. I imagine one of us has a wire crossed. Can anyone explain what's really going on here?
c - c ユニオンとビットフィールド
ビットフィールドをユニオンで使用できますか?
c++ - C / C ++でのニブルの読み取り/書き込み(ビットフィールドなし)
ビットフィールドを使用せずにバイト内のニブルを読み書きする簡単な方法はありますか?私は常に両方のニブルを読む必要がありますが、それぞれのニブルを個別に書く必要があります。
ありがとう!
c - 16ビットビットフィールドは*初期化されていないメモリからの読み取り*警告につながります
私はこのtypedefを持っています:
そして、このコンパイラの警告を受け取ります。
これで、ビットフィールドの代わりにshortを使用すると、警告が消えます。
この警告についてどう考えるかわかりません-わかりません。初期化されていないメモリや読み取り操作もありません。IMHOコンパイラ(VisualDSP ++ 5.0 C / C ++コンパイラ)はここでは間違っています。Timestamp:32
にビットフィールドを使用すると、警告も消えます。
気づかなかったことはありますか?この警告を安全に無視できますか?
c++ - エラーのない方法でビット フィールドのマザー ロードを定義するには、メタプログラミングの魔法が必要です。
目標は、UI レベルでどのタイプのユーザーがどの操作を実行できるかを制御することです。このコードはしばらくの間有効です。少しだけ改善したいです。私が改善しようとしているファイルはおそらく自動生成されているはずですが、それでは変更が大きすぎるため、より簡単な解決策を探しています。
私たちが呼び出すファイルにはPermissionBits.h
、これらの束があります。
ショートカットの助けを借りても1UI64 << <numBits>;
、コーダーが重複した値でフラグを作成したり、タイプミスをしたりするなど、まだ問題があります.
理想的には、適切にフォーマットされ、次のように見えるマクロが必要です。
このマクロを柔軟にして、2 つ未満または 65 個を超える引数 (名前空間名 + 64 個のフラグ) を入力できないようにしたいと考えています。私がやりたいこと、またはそれに近いことをすることは可能ですか、それとも生成されたコードに頼るべきですか? 他にどんなアドバイスがありますか?
c - C では、宣言内のコロンは何を意味しますか?
重複の可能性:
「unsigned temp:3」の意味
私はいくつかのカーネルコードを学んでおり、次の行に沿って行きました(Linux 2.4では、sched.h、struct mm_struct):
これは何を意味するのでしょうか?
c - C に sizeof() に相当するものはありますか?
ビットフィールドに適用すると、Sizeof() は機能しません。
...明らかに、浮動小数点の部分サイズなどを返すことができないためです。しかし、それは興味深い質問をもたらしました。Cで、変数/型のビット数を教えてくれる同等のものはありますか? 理想的には、ビットフィールドに加えて、charやintなどの通常の型でも機能します。
アップデート:
ビットフィールドの sizeof() に相当する言語がない場合、それを計算する最も効率的な方法は何ですか?実行時に! これに依存するループがあり、ビットフィールドのサイズを変更した場合にループが壊れないようにしたいと想像してください。ビットフィールドのサイズとループの長さをマクロにする公正な不正行為はありません。;-)
javascript - JavaScriptでビットフィールドとして整数を使用する
プロジェクトの一環として、0から3までの数字の文字列があります。例:
2030000000000000000030000000000000000003333212111221121301
この文字列をURLに渡したいので、各数値はそれぞれ最大2ビットしか使用しないため、ビットフィールドを使用してみることができると考えました。このような文字列をデータのビットフィールドとして使用される整数の配列との間で変換するために、クラスで次の関数を作成しました。
それらは機能しているように見えますが...完全ではありません。最初に例の文字列を渡すと、次のようになります。
次の出力が得られます。
ただし、これを元に戻すことになっている関数に渡すと、次のようになります。
2番目の文字列の余分なゼロに注意してください。今、私はビットを操作するのは初めてで、これは初めての試みですが、このテーマについて見つけた記事を探して読んだり、紙に書き留めたりしようとしました。ループが進行するときのビットの状態は、何が起こっているのかを理解しようとしますが、なぜそれがうまくいかないのか、そしてそれらの余分なゼロがそこで何をしているのか理解できないようです。私のstring->bitfield
機能がオフになっているか、他の機能がオフになっているか、あるいはその両方である可能性があります。しかし、私は本当にそれを理解することができないので、それがうまくいかないことが何であれ、私がどのように修正できるかについて誰かが何か提案がありますか?
前もって感謝します!