平成18年 秋期 午前 問5 について
クマさん
(No.1)
この問題において、16ビットの最小値は
-32768で
1000 0000 0000 0000
となっていますが、これだと32768との区別が付かないと思うのですが…
先頭の1ビットが符号ビットなら
上の16ビットは2の補数で表現する前に
0 ということになりませんか?
-32768で
1000 0000 0000 0000
となっていますが、これだと32768との区別が付かないと思うのですが…
先頭の1ビットが符号ビットなら
上の16ビットは2の補数で表現する前に
0 ということになりませんか?
2021.02.23 17:02
クマさん
(No.2)
今の考えをまとめました
2進数の ? 1000 0000 0000 0000
32768
0111 1111 1111 1111
2の補数表現?1000 0000 0000 0000
の -32768
?
-0(マイナスが付いても0は0)
との区別が付かないのでは?
2進数の ? 1000 0000 0000 0000
32768
0111 1111 1111 1111
2の補数表現?1000 0000 0000 0000
の -32768
?
-0(マイナスが付いても0は0)
との区別が付かないのでは?
2021.02.23 17:20
クマさん
(No.3)
この考えだと16ビットの最大値が
1111 1111 1111 1111
になってしまいましたね。
てことは何が違うのでしょうか?
1111 1111 1111 1111
になってしまいましたね。
てことは何が違うのでしょうか?
2021.02.23 17:25
管理人
(No.4)
解説にも記載しておりますが、16ビットの固定小数点数では32767(2^16 -1)までしか表現できません。その理由はお気付きの通り正負の見分けがつかないからです。
2021.02.23 17:28
クマさん
(No.5)
@管理者さん
計算して、考えをまとめました。
おっしゃる通りで正負の見分けが付きません。
ですので、2の補数で表現する上
2進数の 1000 0000 0000 0000①
32768
0111 1111 1111 1111②
2の補数表現 1000 0000 0000 0000③
とした場合に、①はマイナスの値にになるのではないか?というのが疑問です。
その上でもう一つあるのですが、
①がマイナスの値にならないのであれば、
最大値は 1111 1111 1111 1111
となり、表現できる範囲は最大32767
ではないのではないか?
というの疑問もでてきたのですが……
計算して、考えをまとめました。
おっしゃる通りで正負の見分けが付きません。
ですので、2の補数で表現する上
2進数の 1000 0000 0000 0000①
32768
0111 1111 1111 1111②
2の補数表現 1000 0000 0000 0000③
とした場合に、①はマイナスの値にになるのではないか?というのが疑問です。
その上でもう一つあるのですが、
①がマイナスの値にならないのであれば、
最大値は 1111 1111 1111 1111
となり、表現できる範囲は最大32767
ではないのではないか?
というの疑問もでてきたのですが……
2021.02.23 17:51
管理人
(No.6)
すみません。説明に誤りがありました。
× 32767(2^16 -1)
○ 32767(2^15 -1)
固定小数点数では先頭が1のビット列は負数とみなします。なので、先頭ビットを0にし、その他のビットを1にしたビット列が正の数の最大値となります。
0 → 0000 0000 0000 0000
1 → 0000 0000 0000 0001
…
32767 → 0111 1111 1111 1111(正の数の最大値)
-1 → 1111 1111 1111 1111
-2 → 1111 1111 1111 1110
…
-32768 → 1000 0000 0000 0000(負の数の最大値)
× 32767(2^16 -1)
○ 32767(2^15 -1)
固定小数点数では先頭が1のビット列は負数とみなします。なので、先頭ビットを0にし、その他のビットを1にしたビット列が正の数の最大値となります。
0 → 0000 0000 0000 0000
1 → 0000 0000 0000 0001
…
32767 → 0111 1111 1111 1111(正の数の最大値)
-1 → 1111 1111 1111 1111
-2 → 1111 1111 1111 1110
…
-32768 → 1000 0000 0000 0000(負の数の最大値)
2021.02.23 18:02
クマさん
(No.7)
ということは
-32768を2の補数表現する際に
マイナスを切り取った32768を①で使っていますが、
この場合は計算上こう表現しているだけで、
「符号ビットの影響は受けず、最大値としても使えない」
ということでしょうか?
-32768を2の補数表現する際に
マイナスを切り取った32768を①で使っていますが、
この場合は計算上こう表現しているだけで、
「符号ビットの影響は受けず、最大値としても使えない」
ということでしょうか?
2021.02.23 18:14
管理人
(No.8)
マイナスを切り取った32768 というのがいまいちわからないのですが、
+32768 → 1000 0000 0000 0000 を2の補数で表現すると、0111 1111 1111 1111 + 1 → 1000 0000 0000 0000 になりますよね。16ビットの範囲だと +32768のビット列と、-32768を2の補数で表現したビット列が同じになるので、負数の方に割り当てている感じです。わかりにくいですかね。
+32768 → 1000 0000 0000 0000 を2の補数で表現すると、0111 1111 1111 1111 + 1 → 1000 0000 0000 0000 になりますよね。16ビットの範囲だと +32768のビット列と、-32768を2の補数で表現したビット列が同じになるので、負数の方に割り当てている感じです。わかりにくいですかね。
2021.02.23 18:21
クマさん
(No.9)
マイナスを切り取った32768というのは、①の1000 0000 0000 0000 のことです。
-32768を2の補数で表現する上、①を反転させて表現しているので、その際に①が一時的に+32768に成っているという事です。
2の補数で表現する上、
-32768~+32767 までが表現可能との事ですが、@管理者さんの説明内の
+32768 → 1000 0000 0000 0000
ここの時点で符号ビットが1なのでマイナスになるのではないか。というのが疑問です。
-32768を2の補数で表現する上、①を反転させて表現しているので、その際に①が一時的に+32768に成っているという事です。
2の補数で表現する上、
-32768~+32767 までが表現可能との事ですが、@管理者さんの説明内の
+32768 → 1000 0000 0000 0000
ここの時点で符号ビットが1なのでマイナスになるのではないか。というのが疑問です。
2021.02.23 18:47
管理人
(No.10)
コンピュータがどのような内部処理を行っているかまでは分かりませんが、仮に演算過程で一時的にそうなっていても、最終的にビット列と数値は一意に関連付けられているので特に問題はないように思います。
2021.02.24 11:48
クマさん
(No.11)
なるほど……
計算自体、人間に都合のいいように作られたものですし、
内部処理の過程に一々気にしてたら駄目でしたね。
こういうものだと捉えておきます。
@管理者さん
ありがとうございました。
計算自体、人間に都合のいいように作られたものですし、
内部処理の過程に一々気にしてたら駄目でしたね。
こういうものだと捉えておきます。
@管理者さん
ありがとうございました。
2021.02.24 13:06
広告
返信投稿用フォーム
スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
広告