![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
No.5ベストアンサー
- 回答日時:
他の方と同じく、C言語の勉強として必要性が全く感じられない知識です。
C言語は、メモリやスタック等のCPUの動作をある程度意識してプログラムを組む必要がある言語ですが、だからといってそんなことまで知っている必要は全くありません。
今時、小さなCPUでも四則演算の命令はありますから、この知識が必要なのは旧式のCPUのプログラマか、CPUの設計者くらいなんじゃないでしょうか?
もう、ほとんど”トリビア”に近いです。
さて、引き算を補数と足し算で行うやり方ですが、概念がわかる程度に解説させていただきます。
この補数による引き算は10進数でもできるので、10進数で説明します。
(#2さんと同じ話をしています)
(1)2進数の世界での1の補数と2の補数は、10進数の世界での9の補数と10の補数にあたります。
(2)補数を考えるときは桁数を限定しないといけません。
ここでは桁数を4桁にします。
つまり
a.0000~9999までしか数を表現できない
b.足し算をして4桁を超えた部分は無視 ← これ大事
(3)ある数Xの9の補数は、引き算をせずとも求まります。
対応表を使います。
0123456789
↓↓↓↓↓↓↓
9876543210
例えば45の4桁の9の補数は、
45=0045→9954
になります。
(4)同じく10の補数は9の補数に1を足すと得られます。
例えば45の4桁の10の補数は、
9954+1=9955
です。
さて、9と10の補数についてわかっていただいたところで早速引き算をしてみましょう。
123-45の計算をしてみます。
1)足す数と引く数を4桁で表す。
0123
- 0045
2)引く数の10の補数を求める
0123
9955
3)足し算する
0123
+ 9955
-----------------------
10078
4)桁を超えた部分を削る
0078
計算終了
と、こんな具合です。
2進数でも同じ要領です。
9、10の補数が1、2の補数になっただけで、桁数の限定、はみ出た桁の無視は同じです。
ところで、上のやり方で9の補数を求めるのに表を使っていましたが、2進数で1の補数を求めるときはその必要はありません。
0/1のビットを反転するだけでできるからです。
ですから2進数の引き算では、加算とビット演算だけで実現できてしまうのです。(加算だって論理演算の固まりですけどね)
....今、この知識が必要な場面を一つ思いつきました。
整数型においての負数表現です。
詳細はここでは述べませんが、その場合でも「なぜ負の数を2の補数で表現するのか?」の理由として紹介する方が適切かも知れません。
ですから根こそぎ必要ない知識ではないですが、CPUが割り算をどう計算しているのかとは、あまり関係のない話ですね。
bnosuke-xさん、ありがとうございます。
素人では、かなり難解でちょっと理解不能です。申し訳ありません。
でも、勉強が進めば理解出来てくるのでしょうか。
頑張ります。
大変お手数お掛けしまして、心より御礼申し上げます。
No.4
- 回答日時:
No.3さんと同じ意見です。
解説が無いのであれば取り上げる必要も無いのです。高機能のCPUでは乗算回路や除算回路を採用している場合がありますがローコストのCPUでは加減算しかできないものも多いのです。
こういうCPUでは乗除算を加減算で行う必要があります。
掛け算は足し算の繰り返しですので足し算で出来ます。
例えば2x5=2+2+2+2+2です。
割り算は何回引き算が出来るかで計算できます。
例えば7÷2は
1回目 7-2 = 5
2回目 5-2 = 3
3回目 3-2 = 1
これ以上引けないので答えは3で余りが1
ただし、これらの方法では効率が悪いのでシフトと加減算を利用する方法を利用します。
これらの計算法は原理的には筆算で行う方法と同じです。ただし表現は2進数が対象になります。
2x5の場合、2進数では10x101です。
10
x 101
____
10
00
+ 10
____
1010 =10(10進数)
割り算は多少複雑です。割り算の場合、最初に割る数と割られる数の最上位の桁が合うように割る数をシフトしておきます。
例えば10÷3の場合は
1回目1010
-1100 (10進の3。桁合わせの為に0を挿入しています)
_________
余り 1010 引けない。 商は0
2回目1010
-0110
_________
余り 0100 引けた。 商は01
3回目0100
-0011
_________
余り 0001 引けた。 商は011
答えは 商3、余り1です。
実際には最初にシフトした分の補正などが必要になります。
参考URLにはマイクロチップのCPUのMATHルーチンを示しておきます。
参考URL:http://ww1.microchip.com/downloads/en/AppNotes/0 …
tadysさん、凄いです。
プログラマー入門者の私では、まだ理解不能です。
ただ漠然とそうなのか~という感じです。
このご回答は保存して、勉強が進んでからまた熟読させていただきます。
ありがとうございました。
No.3
- 回答日時:
その本は捨ててください。
だめな本だと思われます。いまどきのコンピュータで整数表現に1の補数を使っているCPUはありません。2の補数ばかりです。
「すべて足し算でおこなう」というのも、大昔のメインフレームでの話です。1970年代にはすでに引き算命令は普通にありましたし、掛け算命令を持つCPUも現れていました。
現代では、加減乗除命令を持つCPUは普通です。たとえばWindowsが動くようなぱCPUでは、整数と浮動小数点の加減乗除がCPUで行えます。
補数を求めることと加算を行うことさえできれば、加減乗除がすべて行えるのは本当です。実際は、左右シフトとかも欲しいですが。
a-saitohさん、このテキストは古本屋にでも売ることにします。
もっと勉強が進んでからでないと、難しそうですね。
めげずに頑張ってやって行きます。
ありがとうございました。
No.2
- 回答日時:
コンピュ-タにはアダーと呼ばれる加算機があるだけなのです。
それは引き算は引く数の補数をとれば引き算が足し算になってしまうのです10進3桁の場合で 1-1の計算をやって見ます。1の補数は999です。すると 1-1 は1+999=10000となりますが、4桁目がないので答えは0になりますね(^_-) 2-1=2+999=1(4桁目をねぐる) になりますね
二進数の場合、補数は1とゼロを反転させるだけで簡単に作ることができますから引き算の回路は要らないということになります。
更に掛け算は足し算の連続、割算は引き算の連続ですから、アダーだけで計算ができてしまうことになります。勿論乗除算は専用の回路を作りますがそれを構成するのはやはり加算回路だけです。
Willytさん、ご回答ありがとうございます。
初心者がすべき質問ではない内容でした。
ちょっとまだ理解できないので、勉強の過程でまたお尋ねするかもしれません。その際には宜しくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 建築学 二級建築士の構造力学についての質問です。 1 2023/03/05 06:37
- 工学 非言語分野が全くできない人にオススメの参考書を教えてください 1 2023/06/01 16:15
- その他(悩み相談・人生相談) 自分の頭が悪すぎて恥ずかしいですごめんなさい。 なるべく多くの人に答えてもらえたら嬉しいです。 小学 6 2022/03/28 03:17
- 数学 「FFTの基本は、DFTはサンプル数Nが偶数なら 2つのDFTに分解できるということ。 分解するとD 3 2022/03/31 21:01
- C言語・C++・C# C言語 3 2022/10/04 15:07
- その他(家族・家庭) 自分が親の立場として、 子どもが何歳になってから、1人で買い物を行かせますか? 下記の補足は 私の家 3 2023/05/05 21:14
- 化学 化学のエンタルピ変化を求め方について ある例題では各物質のモール数を換算して計算することもあり、ある 1 2022/06/20 23:22
- その他(悩み相談・人生相談) 質問を開いてくれてありがとうございます。 転職で資格を取りたくて悩んでいます。 取りたい資格とはフォ 2 2022/04/05 17:19
- 情報処理技術者・Microsoft認定資格 2進数の問題を教えてください。 1 2022/07/27 09:42
- 経済学 マクロ経済学の「政府支出乗算」の求め方が分かりません。 10 2022/11/20 16:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
8ビットのデータの、先頭ビット...
-
0xffffとは?
-
命令について
-
エクセルVBAのIf,Then 構...
-
32bitと64bit
-
verilog 符号付加減算(最上位...
-
1の補数
-
16ビットCPUで32ビットの計算方法
-
アセンブリ言語の質問のコト
-
C言語「K&R」の演習2-9について
-
PS3に搭載されている"Cell"は、...
-
BMP画像のネガを作成するプログ...
-
C言語の四則演算について
-
03分22秒36のような時間の単位...
-
三菱 シーケンサー
-
BASICのGOTOってコードの書き換...
-
ライン数とステップ数の違いは?
-
アセンブラからC言語に変換する...
-
8086アセンブラで、メモリ間の...
-
フローチャートを書く書かない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
8ビットのデータの、先頭ビット...
-
ビットシフトってどんな時使うの?
-
一般のソフトで画像を扱う場合...
-
C言語で128bitの2進数のビット...
-
命令について
-
符号無し整数xを右にnビット回転
-
文字参照は10進数と16進数では...
-
verilog 符号付加減算(最上位...
-
[VBS] 素早くローテート演算したい
-
算術シフト演算が成り立つ理由...
-
アルゴリズムの計算量とオーダ
-
03分22秒36のような時間の単位...
-
シーケンス制御についての質問...
-
CASLIIでかけ算
-
上位ビットと下位ビットの入れかえ
-
ブール代数で解き方がわかりません
-
ビットの取り出し方法
-
16ビットCPUで32ビットの計算方法
おすすめ情報