eax今回の現象の原因は以下にあります。31で左に31ビット算術シフトし、次に右に31ビット論理シフトを行なっています。(0x80000000)という風になります。31で右31ビット論理シフトするわけですが、上記0x80000000は符号を表す最上位ビットが立った状態になっているため、sarを行なうと1ビットシフトする度に最上位ビットに1が立っていきます。31ビット右シフトした後は以下のような値となります。(0xFFFFFFFF)ということで-1となりました。signedで宣言した場合、符号を維持しようとしてsarを行ないますが、1ビットのビットフィールドを定義した状態だと符号ビットなどというものは存在しないか、符号ビットしかないような状態になるため、それを値として扱いたい側と符号として扱う側とで矛盾が発生し、このような結果になっていると思われます。コンパイラ側からすれば「1ビットで定義するんなら符号ありなんかで定義すんなよ!」ということなのでしょうが、使う側からしたら「察してくれよ!」とか思ってしまいますね・・・。このような状態になるのであればWarningかなんかを出して欲しいです。これが1bitより大きいビットフィールドだと、意図通り最上位ビットが符号ビットとして扱われ、負数を入れたい場合などでもきちんと使えるのだと思いますが、1ビットでは値が保存できなくなってしまいます。0か-1かしか保持しないものだと理解した上で敢えてsignedで定義するかですね(爆)まあ、そもそもビットフィールド自体が環境依存が激しいので出来れば使いたくないというのが正直なところですが、既に大分作り込んでしまっているような人のソースの場合困ってしまいますね・・・。intでのビットフィールドの扱い方の一部をご紹介いたしました。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。...QTCF.dllがないため、プログラムを開始できません。...InitializeQTMLが失敗する。メンバーではありません。エラーDirectShow関係のプログラムを行なっていて、以下のようなエラーが出た。メンバーではありません。