2012年6月12日火曜日

(FF00)_h の2バイトのデータがあり、このデータの数値は負である。これに(1200)_h ...

(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 件のコメント:

コメントを投稿