2進法と2進化10進法の違いを簡略でいいので
教えてください!

懐かしき「2000年問題」の本を読んでいたら

BCDコードの場合

コンピュータの数値認識 
→ 99に1が足されて
  00(で一桁くりあがる)
→ 問題発生

バイナリ値の場合
→ 1999から2000年の変化はただ1増えるに過ぎない

と書いてありました。
できれば上記を踏まえて説明してくれると助かります!
わかりにくい質問かもしれませんがよろしくです。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

2進法とは(16進表現)


0,1,2,3,....8,9,A,B,C,D,F
10,11,12,13,.....18,19,1A,1B,1C,1D,1F
20,21,22,23,....

となっていきますが、整数の場合はよいですが、小数になると、2進数で表せない10進数が出てきます。このために、9のつぎは2進数でも10にするのです。

0,1,2,3,.......8,9
10,11,12,...18,19
20,21,22,...28,29
.........

COBOLなど金銭を取り扱うソフトはBCDを使ってあります。
C,C++などでもBCDを使えるようになっているようです。

10進数の0.1を10回足すと1.0になりますが、2進数ではなりません。0.1を2進数では表せないのです。普通、コンピュータの内部では2進計算ですから、

2進数では(カッコ内は10進数)
1を2で割ると・・・・・0.1(0.5)
0.1を2で割ると・・・・0.01(0.25)
0.01・・・・・・・・・・・・・0.001(0.125)
0.001・・・・・・・・・・・・0.0001(0.0625)
・・・・・・
10進数の0.1を2進数で表すことが出来ません。

FOR i=1 TO 20
  S=S+0.1
  IF S=1.0 THEN PRINT"OK"
NEXT i

このようなプログラムではOKは表示されません。

2000年問題は、メモリの節約のために、下2桁しか使用していなかったために、99に1を足して、100になる1のメモリがありませんから、下2桁の00しか表示されなくて、1900年と認識してしまうために、計算を間違ってしまうのでした、今年は9月問題がありますが、どうなるでしょうか?2001年9月8日問題です。gooで、キーワード「9月」で検索して見て下さい。

長くなりすぎました。後の方の補足を期待して!
    • good
    • 0
この回答へのお礼

お礼がおくれましたが、どうもありがとうございました。
2進数は少数に弱いんですね。
そして
「9月8日」問題、さっそく調べさせていただきます!

お礼日時:2001/08/03 12:44

簡略に説明して欲しいと言うことなので、ごく簡略に。



2進法なら2000は11111010000で表します。(11ビット)
実際には16ビットで0000011111010000で扱います。
2進法はコンピュータの計算に都合がいいのです。

実際には2進法は
(1)人間に判りにくい。
(2)画面に表示したり、印刷したりするのに10進法に直さなければならない。
という欠点が有るため、10進と2進の中間の記憶形式を取ります。
これが2進化10進数(BCD:10進数の1桁づつをそれぞれ2進で表す)です。99は1001 1001のごとくです。(4ビット表示)

先の方が言われている通り、BCDの世界は乱れていて、4ビット形式、8ビット形式、符号の有り無しなど統一されていません。
2000年問題に限って言えば、BCDとは言っても下2桁を8ビットの文字コード(ASCII)2桁でファイルに保持していたといえるでしょう。
1999年は99しか持っていませんから1を足すと00(100では有りません)。従って2000年でなく1900年に戻ってしまいます。

正確でないのを承知でわかりやすく言うと2000年対策というのは先に1900を足してから1を足せば(99+1900+1)で正しい2000年が得られるということなのですね。

簡略とはいえなかったですね。(^^;;
    • good
    • 0

われわれが普段使っているのが10進数であることと、コンピュータ内部では2進数を使っていることはご承知だと思います。

そこでわれわれが使っている10進数をコンピュータが使う2進数に直すこと、またその逆を考えなければなりません。

その方法が2通りあるということです。
1つ目のBCDですが2進数は、4桁(4bit)で10進数の0から15までを表せますので、このうち0から9までを使って10進数の1桁を表す方法です。つまり、1バイト(8bit)で10進数の2桁を表すことができます。
さてここで、プログラムの書き方ですが、年を表すのにデータ容量をケチって1バイトで表すと、プログラム上で
BCD 表す年
00→1900年
99→1999年
とするのが簡単でいいですね。すると、2000年を表す方法がありませんので2000年問題となるわけです。
さて、バイナリ値ですが、上記と同じ1バイト(8bit)で年を表すとすると、2進数8桁は10進数で0から255まで表すことができることになります。(2000年を正確にに表現しようとすると2進数11桁で、0から2047まで表せますので2バイト以上あればもっといいことになります)
さてプログラムでは、
バイナリ 表す年
0   →1900年
99  →1999年
100  →2000年
255  →2155年
となりますので、2000年を正確に表すことができることになります。(もちろん、バイナリ値0を1900年とするという前提ですが・・・)つまり、2000年問題は起こらないということになります。

brogieさんも書いておられますが、昔はよくBCDを使っていたので(バイナリ→10進変換のプログラムの容量すら削減したかった)その当時のプログラムを使っていると問題が起こることになりますね(実際、私も昔遊びで作っていたプログラムはBCDを使って計算していました。)
    • good
    • 0

昔のコンピュータ(といっても元祖のENIACは10進計算なので除外)は“数値計算”だけを目的としていました。


10進数を2進数にすると…
0 - 0000
1 - 0001
2 - 0010
....
7 - 0111
8 - 1000
9 - 1001
コレに符号(+と-)を加えたものを2進化10進数(Binary Coded Decimal=BCD)と呼んでいました。

その後、コンピュータで英文字を使う必要が出てきたので全体を8bitに拡張して文字と数字を表せるようになりました。
コレを拡張2進化10進コード(Extended Binary Coded Decimal Interchange Code=EBCDIC)と呼び、数字の場合BCDの値(0000~1001)は下位bitに、上位は16進のF(1111)をつけて表します。
結果、EBCDICにおける数値はF0(11110000)~F9(11111001)となります。

その後、標準コードとして制定されたASCIIコード(ASCIIを元に制定されたJISを含めて考えてください)では数字の上位を3として30(00110000)~39(00111001)となっています。
現在BCDというと1桁4bit(Pack),1桁8bitでEBCDIC(ZoneまたはUnpack),1桁8bitでASCII(ZoneまたはUnpack)の3種類があるので気をつけてください。

コレに対して数値(数字で無い事に注意)は8bitで00(00000000)~FF(11111111,10進では255)を表す事が出来ます。

10進整数99を2バイトで表現する場合を比較すると(数字はZoneでASCII)
数字=3939(00111001 00111001)
数値=0063(00000000 01100011)
となります。

数字表現では1バイトで0~9しか表現できない為、2バイトで0~99が表現できます。
結果、99+1は100(3バイト必要)となり、けた上がりした最上位1桁が失われます(桁あふれ)。
対して、数値表現は2バイトで0~65536が表現可能です。
こちらは99+1=100でも2バイトで表現が可能です。

最後に、以上の説明はかなり乱暴です。
・1バイト=8ビットを仮定している
・符号を考慮していない
・BCDの解説が大雑把すぎて正確でない
etc...
正確な解説は書籍を参照して下さい。
    • good
    • 0
この回答へのお礼

回答どうもありがとうございました!
コードについての解説が
私にとっては少々難しかったのですが、
おおまかなコードの流れがよくわかりました!

書籍等もいろいろ読みつつ私も自分自身のレベル
をあげていきたいです。
どうもでした!

お礼日時:2001/08/03 12:54

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q10進数をBCDに変換する方法

10進数から2進化10進数(BCD)に変換するところで疑問があります。
たとえば、10進数の3846をBCDに変換する場合答えはどのようになりますか?

私なりに考えたところまでを示しますが、答えがわかりません。
どこに考え方の間違いがあるのでしょうか?

まず、3846を2進数に変換しました。
3846 → 0000111100000110 (2進数)となります。

ここからBCDに変換する場合、4ビットずつを1つと考えて数字を表現するので、上記の2進数の頭から4つずつ分けて考えると

1つ目 0000
2つ目 1111
3つ目 0000
4つ目 0110
の4つにわけました。

続いて、それぞれを10進化しました。
1つ目 0000 → 0
2つ目 1111 → 15
3つ目 0000 → 0
4つ目 0110 → 6

ここで疑問が出てきます。
2つ目のところで、1111を10進化すると15となってしまい桁上りが生じます。
この場合どのように処理するのが良いのでしょうか?

どなたかご教授ください。

Aベストアンサー

BCDに変換する際、数値全体を2進数に変換する必要はありません。
各桁を構成している数値を2進数に変換して、合体させればよいです。
10進数の3846をBCDに変換するのであれば、
3 → 0011
8 → 1000
4 → 0100
6 → 0110
より、
0011 1000 0100 0110
です。

QBCD・HEX・BINについて

設備のタッチパネルでBCD入力にて100をいれました。HEXに変換した値はいくらでしょうか?

Aベストアンサー

まず、2進と16進の表現方法はお分かりですね。乱暴な言い方をすれば、この2つは同じです。2進を4桁ずつ区切ったものが16進です。

さて、BCDですが、2進を4桁ずつ区切るまでは16進と同じですが、16進のAからFまでを使わない方法になります。つまり、9(=1001)に1を足した時、2進・16進の時は 1010 = A になりますが、BCD表現だと10000になります。2進数の考え方だと、1001の次が10000になりますので連続しないことになりますが、2進を下位から4桁ずつ区切ると、9の次が10と表現されるので、10進数だと思えば連続しているように見えます。

そこで、BCDで100を表現しようとすれば、1桁ずつ'1', '0', '0' をそれぞれ2進4桁で表現して、'0001' '0000' '0000' として、これを並べて 0001 0000 0000 がBCD表現となります。これを16進表現しても、4桁ずつ区切るわけですから"100"になります。

一方、10進数の100をを16進数で表現する場合、100 = 4 + 16×6 となりますから、16進数で64、2進数では 0110 0100 になります。つまり、10進数Xを16進表現するには、
X = k<0> + 16^1 × k<1> + 16^2 × k<2> + … + 16^n × k<n>
( 0 ≦ k<0>, k<1>, k<2>, … , k<n> ≦ 15 )
という k<0>…k<n> を見つけて、k<n>から並べていけばいいのです。具体的な計算方法は、Xを超えない16^nを見つけてXをそれで割ると商がk<n>になります。次にその割り算の余りを16^(n-1)で割ると商がk<n-1>、さらにその余りを16^(n-2)で割った商がk<n-2>、・・・と繰り返して、最後は16で割った商がk<1>余りがk<0>となります。

16^2 = 2^8 = 256, 16^3 = 2^12 = 4096, 16^4 = 2^16 = 65536

ぐらいは覚えておけば、なにかと役に立ちます。

まず、2進と16進の表現方法はお分かりですね。乱暴な言い方をすれば、この2つは同じです。2進を4桁ずつ区切ったものが16進です。

さて、BCDですが、2進を4桁ずつ区切るまでは16進と同じですが、16進のAからFまでを使わない方法になります。つまり、9(=1001)に1を足した時、2進・16進の時は 1010 = A になりますが、BCD表現だと10000になります。2進数の考え方だと、1001の次が10000になりますので連続しないことになりますが、2進を下位から4桁ずつ区切ると、9の次が10と表現されるので、10進数だと思えば連続...続きを読む

QN進法について

お忙しい中お願いがあります。

学校の授業でノートを取ったのですが、その中でわからない点がありお聞きしたいと思いました。

内容は「基数とはN進法のN」(0からN-1番目の数字で表現)とありましす。

「0からN-1番目」とは何のことかわかりません。

N-1ばんめとはなんのことでしょうか?

どなたかよろしくお願い致します。

Aベストアンサー

基数が10の数とは10進法で表現された数のこと。10進法では数値を0から9の数字の組合せで表現する。

QLISP - (BCD) から B だけを取り出したいです。

学校でLISPを使ってのプログラミングの宿題が出ました。
初めてなので、わからないことだらけなのですが、
(A BCD)からAを取り出すには
(CAR '(A BCD))
で取り出せますよね。
(BCD)からBだけ、もしくはCだけを取り出すにはどうすればよいのでしょうか?
どうぞよろしくお願いします。

Aベストアンサー

専用の組み込み関数はなかったと思いますが、

(make-symbol (subseq (symbol-name 'bcd) 0 1))

とすればできます。
最後にできたシンボルを現在のpackageに登録したければ、make-symbol を intern にしてください。

Qバイナリって

よくバイナリファイルとかバイナリという言葉を聞きますがどういう意味なのでしょうか?またバイナリエディタで何ができるのでしょうか?教えてください

Aベストアンサー

私流に言えば、バイナリとは文字コード以外を捉える見方である。
(1)コンピュターの扱うデータの発達から見ると、早いうちに、ワードマシンからバイトマシンになり、データは数字-->英字まで広がり、日本ではカナまで広がりました。
この時期までは、コンピュタメモリ内や外部記憶装置内は、文字コード(英数カナ)・機械語指令・アドレス・2進数・パック数・制御コード(改行コード等)・ビットコードなどでした。測定データでアナログ->ディジタルに変換したデータなども在ったかと思います。
メモリが少なく、識別データはビットデータへ向かい勝ちでした。
先端的な大学・研究所などを除き、一般には
バイナリデータと意識するのは、文字コード以外を確認する必要の在る
プログラマのデバッグのダンプリスト(16進表示)などでした。
(2)そのうちにパソコンが普及し、文字コードも漢字コードが増え、ビットフォントなどにも文字コードで表せないものが、広がりました。
識別サインデータはバイトデータ(文字コード)へ向かい勝ちでした。
(3)ウインドウズ時代になり、マルチメヂアと言うことで、画像、音声、
動画などを扱えるようになりました。これらは文字コードで捉えるべきものではありません。
 そのほかにデータ量が飛躍的に増え、データを圧縮することが行われます。圧縮データは文字コードは無関係であるわけです。
(4)文字コードで表現しても意味のないバイナリデータは、表現方法と
して、0と1の羅列で表すか、16進数(0-9、A-Fの2つの組み合わせで
1バイトを表す)で表すかがありますが、文字数が少なくて済む16進表現が普通は取られます。
(5)(4)で行わず、画像なら画像そのものにディスプレイに再現したり、プリンタで印刷したり、音ならスピーカから音を出すことも勿論行われます。
(6)文字コードはバイト区切りが意味を持っているのですが、それ以外は
バイトの域を越えて連連とデータが続くので、扱うソフトはそれなりの読み書き
をするよう対応するのです。そのことを捉えて、バイナリデータを扱うと
言うことになります。

私流に言えば、バイナリとは文字コード以外を捉える見方である。
(1)コンピュターの扱うデータの発達から見ると、早いうちに、ワードマシンからバイトマシンになり、データは数字-->英字まで広がり、日本ではカナまで広がりました。
この時期までは、コンピュタメモリ内や外部記憶装置内は、文字コード(英数カナ)・機械語指令・アドレス・2進数・パック数・制御コード(改行コード等)・ビットコードなどでした。測定データでアナログ->ディジタルに変換したデータなども在ったかと思います。
メモリ...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報