- ベストアンサー
変数のビット列
char型の変数numに num = 128 + 64 + 16; と入力した時、numの中身は、 11010000 となっているのか、 00001101 となっているのか(最下位桁が右か左か)調べたいのですが、格納されている状態(バイトオーダーが使用される前の状態)で表示する命令を教えていただけませんでしょうか。 最終的に、char型の下位7bitを使って数値処理をしたく、その場合には、 num = num << 1; と、 num = num >> 1; のどちらにすればいいのか、変わってくるかと思います。 ご回答の程お願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
型によらず整数の内部ビット表現は上位ビット←→下位ビットの順に並べることになっています。したがって <<:左シフト演算子は桁上げ >>:右シフト演算子は桁下げ です。 JIS X3010:2003にも規格書6.5.7章 ビット単位のシフト演算子の項に、 E1<<E2の...結果の値はE1×2^E2の、結果の型で表現可能な最大値より1大きい値を法とする剰余とする。...E1>>E2の...結果の値はE1/2^E2の商の整数部分とする。... となっています。
その他の回答 (4)
- rentahero
- ベストアンサー率53% (182/342)
#2です。 #4の方の回答のとおり、signed charでかつ負数の場合の処理に問題があります。 charに128以上の値を入れていたので、すっかりunsigned charだと思い込んでいました。
お礼
わざわざ補足説明をしてくださり、ありがとうございます。 又、誤解を招くような表記をしてしまいもうしわけありませんでした。
- jacta
- ベストアンサー率26% (845/3158)
やはりターゲットに依存します。 char型のビット数、符号の有無、負の値の表現方法が処理系に依存します。 特にchar型が8ビットで符号ありの場合が厄介です。この場合、numは128+64+16の値を表現できませんから、JIS X3010:2003の6.3.1.3に基づき、処理系定義の値になるか、処理系定義のシグナルを発生することになります。 仮に11010000というビット列として格納されたとしても、numを整数拡張するとint型かつ負になり、次の問題が起こります。 #2の方が規格から引用された部分は、符号なし整数に関する部分です。その直後にこう書かれています。 --- 引用ここから --- E1が符号付き整数型と非負の値をもち、E1×2^E2が結果の型で表現可能である場合、それが結果の値となる。それ以外の場合、その動作は未定義とする。 --- 引用ここまで --- つまり、numに格納された値が負ならば、それを整数拡張した<<演算子のオペランドもまた負であり、その動作は未定義になってしまいます。 したがって、これはバイトオーダーやシフト方向の問題だけではすみません。期待した処理をするには次のようにします。 unsigned char num = 128 + 64 + 16; num = num << 1;
お礼
回答をくださり、ありがとうございます。 num = 128+64+16; としたのは、ビット列の例を示すために書いたものですが。動作について詳しく知ることが出来たので、感謝しております。
- ddnp009
- ベストアンサー率25% (15/58)
charであれば、バイトオーダーもへったくれも ない・・・のじゃないかな。 下位7ビットを使って、というのは、 0x7Fとの論理積を取るんじゃだめ?
お礼
回答をくださりありがとうございます。 申し上げた、 num = num << 1; とするやり方は、あくまで手段の一つですので、 0x7Fの論理積を取る方法については、今後検討させていただきます。
- ultraCS
- ベストアンサー率44% (3956/8947)
どういう開発かわかりませんが、ターゲットCPUが無いと正確な答えは得られないと思いますよ。 インテルの8080以降であれば、レジスタ上も11010000でしょう。8bit対象でunsigned charなら、リトル/ビッグエンディアンを気にする必要はないと思います。 2bitや4bitのマイコン用のクロス開発なら、CPUのテクニカルシートやクロス環境の説明に書いてあるんじゃないかな。 char型変数でnumというのは、可読性からすると、私のようなオールドプログラマには居心地が悪いなあ・・
お礼
回答をくださり、ありがとうございます。 簡単なお礼文となってしまい、もうしわけありません。
お礼
ありがとうございます。 おかげで、答えにたどりつけました。