char型の変数numに
num = 128 + 64 + 16;
と入力した時、numの中身は、
11010000
となっているのか、
00001101
となっているのか(最下位桁が右か左か)調べたいのですが、格納されている状態(バイトオーダーが使用される前の状態)で表示する命令を教えていただけませんでしょうか。
最終的に、char型の下位7bitを使って数値処理をしたく、その場合には、
num = num << 1;
と、
num = num >> 1;
のどちらにすればいいのか、変わってくるかと思います。
ご回答の程お願いします。
No.2ベストアンサー
- 回答日時:
型によらず整数の内部ビット表現は上位ビット←→下位ビットの順に並べることになっています。
したがって<<:左シフト演算子は桁上げ
>>:右シフト演算子は桁下げ
です。
JIS X3010:2003にも規格書6.5.7章 ビット単位のシフト演算子の項に、
E1<<E2の...結果の値はE1×2^E2の、結果の型で表現可能な最大値より1大きい値を法とする剰余とする。...E1>>E2の...結果の値はE1/2^E2の商の整数部分とする。...
となっています。
No.4
- 回答日時:
やはりターゲットに依存します。
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;
としたのは、ビット列の例を示すために書いたものですが。動作について詳しく知ることが出来たので、感謝しております。
No.1
- 回答日時:
どういう開発かわかりませんが、ターゲットCPUが無いと正確な答えは得られないと思いますよ。
インテルの8080以降であれば、レジスタ上も11010000でしょう。8bit対象でunsigned charなら、リトル/ビッグエンディアンを気にする必要はないと思います。
2bitや4bitのマイコン用のクロス開発なら、CPUのテクニカルシートやクロス環境の説明に書いてあるんじゃないかな。
char型変数でnumというのは、可読性からすると、私のようなオールドプログラマには居心地が悪いなあ・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- PHP カラーミーショップのSmartyでの文字列抜き出し 2 2022/05/06 11:51
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- JavaScript JAVASCRIPT 2 2022/04/15 15:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Stringクラスの変数の格納アド...
-
VB.NET+Javascriptで、VB.NETで...
-
ダブルクォーテーションを含む...
-
DateTimePickerに値を入れたい...
-
javaのCSVデータ読込についてです
-
実行シェルからCOBOLへパラメー...
-
ArrayListの要素数の上限
-
Javaの問題なのですが、「3文字...
-
暗号化文字列を英数字のみにしたい
-
BCD形式で時刻を!
-
ResultSetの内部構造(Java)
-
JSPでの計算結果表示
-
EL式でのbeansからの値取得につ...
-
char型での演算子
-
PSQLExceptionが発生する
-
EM_GETSELメッセージについて。
-
hiddenの値を消したくない!
-
Evaluate()に文字列の形式の数...
-
wsprintf関数の使い方について
-
テキストファイルを読み込んで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルクォーテーションを含む...
-
ArrayListの要素数の上限
-
特定の文字列を複数抜き出した...
-
javaのCSVデータ読込についてです
-
wsprintf関数の使い方について
-
BCD形式で時刻を!
-
結合した文字列をファイル名に...
-
Evaluate()に文字列の形式の数...
-
C言語の変数(LSB)の合わせ込...
-
実行シェルからCOBOLへパラメー...
-
hiddenの値を消したくない!
-
VB6,論理演算子Orの使い方がわ...
-
DateTimePickerに値を入れたい...
-
char型での演算子
-
String str = "a\\\\b\\\\c";
-
Javaの問題なのですが、「3文字...
-
8桁整数を限りなく短い文字列に...
-
matchesを否定文として使う方法...
-
DOSバッチで変数の値を変数名に...
-
excel vba 時間計算と条件分岐...
おすすめ情報