(FF00)_h の2バイトのデータがあり、このデータの数値は負である。これに(1200)_h のデータを加算した結果を10進数で表せ。
という問いがあった時、
これを足すと、(11100)_hとなり、下2バイトと取ると (1100)_hになると思うのですが、この後、この数字をどうやって10進数で表わすのですか?
このまま10進数(4352)に直すのですか?
東南アジアで好評の「J 言語」を使うと便利である。
これは、カナダ産で、下記から free で DL 可能です。
http://www.jsoftware.com
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
● (FF00)_h の2バイトのデータは
16 #. 15 15 0 0 -> 65280 )dec, 10進法
2^8 -> 256)dec
2^16 -> 65536)dec
● さて、
(4 # 16) #: 65536 -> 0 0 0 0 )hex
即ち、 2 バイト、非負 では ゼロ である。
そこで、
65536 - 256 -> 65280 故、2 バイト表現では
-256 と 65280 は同じである。
即ち、話題の
「(FF00)_h の2バイトのデータで負数は -256] である。
● 計算開始
(1200)_hを dec にする。 J 言語流で
16 #. 1 2 0 0 )hex -> 4608 )dec
-256)dec + 4608)dec -> 4352) dec ・・・(答)
以上、簡単な話でした。
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
● 補足質問への回答:
御質問の如く、下2バイトは (1100)_h、これは良し!
これを dec 10進数に変換する。
J 言語流で
16 #. 1 1 0 0 -> 4352 )dec ・・・ (先の答と同じ)
要するに、貴方の解答は合って居ります。 おめでとう!
>>このまま10進数(4352)に直すのですか?
はい、このまま10進数に直して頂いて問題ありません。
また、問いにより下記のような違いがしょうじます。
>>(FF00)_h の2バイトのデータがあり、このデータの数値は負である。
おそらく、2の補数表現を用いる事を意味しています。
この場合
符号付きの数値を表します。
16進数4ケタのデータの範囲は -32768 (8000)_h ~32767 (7FFF)_h
この場合
(FF00)_h = -256
(FF00)_h の2バイトのデータがあり、このデータの数値は "正" である。
この場合
符号無の数値をあらわします。
16進数4ケタのデータの範囲は 0 (0000)_h ~65535 (FFFF)_h
この場合
(FF00)_h = 65280
以下は, 負の数が2の補数で表現されていると仮定しています
(FF 00)_h + (12 00)_h = (01 11 00)_hです
下2バイトは(11 00)_hで,これは2進数で表すと
(0001 0001 0000 0000)_2
です
最上位桁が0ですから正の数です
つまり,そのまま10進数になおせばよいです
したがって, (FF 00)_h + (12 00)_h = (11 00)_h = 4352
実際,
(FF 00)_hは(FF 00)_h+(01 00)_h=(1 00 00)_hですから, (FF 00)_h = -(01 00)_h = -256
(12 00)_h=4608
4608-256=4352
です
0 件のコメント:
コメントを投稿