【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集

CPUは引き算を行うことができず、2の補数を用いて引き算を足し算として考えれると知りました。
そこで8bitの最上位桁を符号とした7bitの引き算-24+(-8)を計算してみたのですが

24(10進数)→0011000(2進数)→1101000(2の補数)
8(10進数)→0001000(2進数)→1111000(2の補数)

符号 7654321←bit
 1 1101000
+1 1111000
 X 1100000

となり、1100000の2の補数をとると
0100000(2進)→32(10進数)で答えを求められました。

そこでお聞きしたいのですが、値を足したとき(↑の例だと1100000)が求められたときにどういった条件だと1100000の2の補数をとる必要があるのでしょうか?

↑の例だとXがどの条件のときでしょうか?
質問が長くなってしまいましたがよろしくお願いします。

A 回答 (6件)

> 24(10進数)→0011000(2進数)→1101000(2の補数)


→11101000(2の補数) …が正しい。
> 8(10進数)→0001000(2進数)→1111000(2の補数)
→11111000(2の補数) …が正しい
符号ビットをつけて「2の補数」になります。

計算は8ビットで加算をします。
(-24)+(-8)=
-(00011000)2-(00001000)
=(11101000)2
+(11111000)2
=(11100000)^2 …最上位の8ビット目から9ビット目への桁上がりは無視します、
=-(00100000)^2 …これば10進数の「-32」です。

>どういった条件だと1100000の2の補数をとる必要があるのでしょうか?
2の補数法表現を正しく認識されていないようです。8ビットで2の補数で計算をしへっかも2の補数法で出てきますので改めて2の補数をとる必要はありません。負の数か、正またはゼロの数かは先頭ビットで判別できます。
それが2の補数法の特徴です。

>↑の例だとXがどの条件のときでしょうか?
この質問はナンセンスです。
Xは8ビットの2の補数表現として求まります。そして先頭ビットで負数か、そうでないかを判別できます。

人間に分かりやすいようにする便法として、
10進数や普通の2進数に変換しますが、その際は
2の補数法表現を
符号と絶対値(符号なし数値)とに分離してやります。

先頭ビットがゼロならそのまま符号なし2進数(10進数の場合は10進変換してやる)になり、先頭ビットが1なら、符号「-」と絶対値(2の補数を取ってやれば絶対値が得られる)に分離して「-(符号なし2進数)」の形にしたり、10進数の場合は、符号なし2進数の箇所を10進変換してやります。

■■ 2の補数法は8ビットを使った2進数の表現法です。■■
演算も符号ビットを区別することなく、8ビットで行います。
結果として先頭ビットがゼロであれば正またはゼロの数、先頭ビットが1だと負数と分かるだけです。
    • good
    • 0
この回答へのお礼

解答ありがとうございます
ご指摘のとおり符号ビットもいれた8bitの演算でした

>8ビットで2の補数で計算をしへっかも2の補数法で出てきますので改めて2の補数をとる必要はありません。
>負の数か、正またはゼロの数かは先頭ビットで判別できます。
>それが2の補数法の特徴です。

とあるのですが、つまり

 11101000 :24の2の補数
+11111000 :8の2の補数
 11100000 :結果

11100000の最上位bitは1ということで負を表している。
そこで10進数に戻す際には2の補数を行い11100000→00100000になるということでしょうか?

また、
>2の補数法は8ビットを使った2進数の表現法です。
とあるのですが8bit以上の計算では2の補数は用いられないのでしょうか?

お礼日時:2009/03/12 11:49

#3です。


A#3の補足質問の回答
> そこで10進数に戻す際には2の補数を行い11100000→00100000になるということでしょうか?

そうです。
11100000 → -(00100000) → -32
という手順で戻します。

>8bit以上の計算では2の補数は用いられないのでしょうか?
計算機で走っているソフト次第です。
大抵は倍精度の整数が扱えます。
普通のソフトの整数(単精度)では16ビットの2進数を扱っています。
(8ビットの2の補数による整数は8ビットマイコンの時代のマシン語やアセンブラなどで使われていました。)
倍精度整数では32ビットの2の補数法、4倍精度整数では64ビットの2の補数法が使われます。
    • good
    • 0
この回答へのお礼

ご丁寧な回答ありがとうございました。
とても分かりやすかったです。

お礼日時:2009/03/12 14:23

#4です。


下記の「演算」は「足し算」と訂正させて下さい。計算を見てもらえば意をくみとっていただけると思いますが、訂正させてね。
>負数同士の演算は負にならないとね。

>どういった条件だと1100000の2の補数をとる必要があるのでしょうか?
回答者のみなさんが教えて下さっているのでなんですが、2の補数は、正の2進数から負の2進数を求めるときの計算方法だと考えると判りやすいかも。つまり真逆は、負の2進数から正の2進数を求める行為をしている。演算だけに限るなら2度手間だからする必要はないと。
あえてするなら2進-10進に変換したいときの中間処理かな?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ご指摘のとおり符号部分も含めて計算すると解決できました。

お礼日時:2009/03/12 11:59

こんにちは


符号bitも含めて演算するだけでよいのでは?
1110 1000
1111 1000 +
-----------
1110 0000

 いうまでもないことですが 8 bitで正の最大値は +127 (0111 1111b)、負の最大値は -128(1000 0000b)なので、結果が上記の範囲内なら負数同士の演算は負にならないとね。
 -128+(-1)だと?8 bitで表現できる範囲を超えるのでアンダーフローが発生し計算が成り立たなくなります。
実際の 8 bit の演算器を持つコンピューターなら、演算の状態を様々なフラグ(符号?、演算結果がゼロ?、下位4bitからの繰り上がり有無、結果が8bitの範囲内か、桁上がりがあるか..)で知ることが出来ますのでそれを見て異常処理を入れます。
    • good
    • 0

何か誤解をされているようですが、「引き算」と「足し算」は、機械語


でも厳然と区別されてプログラムされてますよ。ですので、結果を見て
判断するんじゃなく、どこかに「これは引き算です」というフラグが
あって、そのフラグがあれば補数の計算をするんです。

具体的には「引き算」サブルーチンを呼び出す、という処理なんですが。
    • good
    • 0
この回答へのお礼

解答ありがとうございました

お礼日時:2009/03/12 11:28

 


>32(10進数)で答えを求められました。
 -32ね。

>どういった条件だと1100000の2の補数をとる必要があるのでしょうか?
 Xの最上位ビットが 1 のとき。
 
    • good
    • 0
この回答へのお礼

早速の解答ありがとうございました

お礼日時:2009/03/12 11:27

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