プロが教えるわが家の防犯対策術!

char型の変数numに
num = 128 + 64 + 16;
と入力した時、numの中身は、
11010000
となっているのか、
00001101
となっているのか(最下位桁が右か左か)調べたいのですが、格納されている状態(バイトオーダーが使用される前の状態)で表示する命令を教えていただけませんでしょうか。
最終的に、char型の下位7bitを使って数値処理をしたく、その場合には、
num = num << 1;
と、
num = num >> 1;
のどちらにすればいいのか、変わってくるかと思います。
ご回答の程お願いします。

A 回答 (5件)

型によらず整数の内部ビット表現は上位ビット←→下位ビットの順に並べることになっています。

したがって
<<:左シフト演算子は桁上げ
>>:右シフト演算子は桁下げ
です。

JIS X3010:2003にも規格書6.5.7章 ビット単位のシフト演算子の項に、

E1<<E2の...結果の値はE1×2^E2の、結果の型で表現可能な最大値より1大きい値を法とする剰余とする。...E1>>E2の...結果の値はE1/2^E2の商の整数部分とする。...

となっています。
    • good
    • 0
この回答へのお礼

ありがとうございます。
おかげで、答えにたどりつけました。

お礼日時:2006/03/02 01:28

#2です。



#4の方の回答のとおり、signed charでかつ負数の場合の処理に問題があります。

charに128以上の値を入れていたので、すっかりunsigned charだと思い込んでいました。
    • good
    • 0
この回答へのお礼

わざわざ補足説明をしてくださり、ありがとうございます。
又、誤解を招くような表記をしてしまいもうしわけありませんでした。

お礼日時:2006/03/02 01:29

やはりターゲットに依存します。


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;
    • good
    • 0
この回答へのお礼

回答をくださり、ありがとうございます。
num = 128+64+16;
としたのは、ビット列の例を示すために書いたものですが。動作について詳しく知ることが出来たので、感謝しております。

お礼日時:2006/03/01 18:19

charであれば、バイトオーダーもへったくれも


ない・・・のじゃないかな。

下位7ビットを使って、というのは、
0x7Fとの論理積を取るんじゃだめ?
    • good
    • 0
この回答へのお礼

回答をくださりありがとうございます。
申し上げた、
num = num << 1;
とするやり方は、あくまで手段の一つですので、
0x7Fの論理積を取る方法については、今後検討させていただきます。

お礼日時:2006/03/01 18:21

どういう開発かわかりませんが、ターゲットCPUが無いと正確な答えは得られないと思いますよ。



インテルの8080以降であれば、レジスタ上も11010000でしょう。8bit対象でunsigned charなら、リトル/ビッグエンディアンを気にする必要はないと思います。
2bitや4bitのマイコン用のクロス開発なら、CPUのテクニカルシートやクロス環境の説明に書いてあるんじゃないかな。

char型変数でnumというのは、可読性からすると、私のようなオールドプログラマには居心地が悪いなあ・・
    • good
    • 0
この回答へのお礼

回答をくださり、ありがとうございます。
簡単なお礼文となってしまい、もうしわけありません。

お礼日時:2006/03/01 18:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!