No.1ベストアンサー
- 回答日時:
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月」で検索して見て下さい。
長くなりすぎました。後の方の補足を期待して!
お礼がおくれましたが、どうもありがとうございました。
2進数は少数に弱いんですね。
そして
「9月8日」問題、さっそく調べさせていただきます!
No.4
- 回答日時:
簡略に説明して欲しいと言うことなので、ごく簡略に。
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年が得られるということなのですね。
簡略とはいえなかったですね。(^^;;
No.3
- 回答日時:
われわれが普段使っているのが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を使って計算していました。)
No.2
- 回答日時:
昔のコンピュータ(といっても元祖の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...
正確な解説は書籍を参照して下さい。
回答どうもありがとうございました!
コードについての解説が
私にとっては少々難しかったのですが、
おおまかなコードの流れがよくわかりました!
書籍等もいろいろ読みつつ私も自分自身のレベル
をあげていきたいです。
どうもでした!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学受験 国立受験 11月からの大逆転劇を起こすには 7 2022/11/14 19:24
- その他(データベース) 4進数風なバーコードは何ですか? 2 2022/11/28 23:33
- 経済学 マクロ経済学で政府支出が変化した場合に図示する方法について教えてください。 6 2022/11/23 18:48
- 労働相談 合意済み仕様の商品納入後における仕様変更要求への対応について 5 2023/04/19 09:41
- 法学 刑法と社会について 2 2022/07/31 01:38
- 大学受験 娘の大学受験勉強 6 2022/06/30 19:58
- 高校 三次関数のグラフにつきまして 3 2022/05/15 11:14
- 知人・隣人 就活勤務地迷ってます 私は現在オーストラリアの大学に通ってる就活生です 高校もオーストラリアの高校に 7 2022/11/08 02:14
- Illustrator(イラストレーター) アイビスペイント、原稿作成について 1 2023/07/14 03:01
- 宅地建物取引主任者(宅建) 未経験・知識ゼロからの宅建取引士勉強方法について 2 2022/06/10 14:38
このQ&Aを見た人はこんなQ&Aも見ています
-
これまでで一番「情けなかったとき」はいつですか?
これまでの人生で一番「情けない」と感じていたときはいつですか? そこからどう変化していきましたか?
-
3分あったら何をしますか?
カップ麺にお湯を入れて、できるまでの3分間で皆さんは何をしていますか?
-
これが怖いの自分だけ?というものありますか?
人によって怖いもの(恐怖症)ありませんか? 怖いものには、怖くなったきっかけやエピソードがあって聞いてみるとそんな感覚もあるのかと新しい発見があって面白いです。
-
食べられるかと思ったけど…ダメでした
「この煮物、だいぶ放置しちゃったけど大丈夫かな…」 「食べ物じゃないけど、なんか食べたらすごく美味しそうな気がする」
-
我が家のお雑煮スタイル、教えて下さい
我が家のお雑煮スタイル、教えて下さい! (お汁)味噌汁系? すまし汁系? (お餅)角餅? 丸餅? / プレーンなお餅? あんこ餅?
-
BCDについて
C言語・C++・C#
-
10進数をBCDに変換する方法
その他(プログラミング・Web制作)
-
シーケンサー入力で装置でよくBCDコード1248と言いますが。
その他(自然科学)
-
-
4
BCD出力で表示されたものをBINに変換すると
その他(コンピューター・テクノロジー)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルシート名の制限を変更...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
「1TB」のHDDに日本語は何字入...
-
半角、全角の判別方法
-
バイト列とバイナリ列の違いが...
-
文字数を取得したい
-
Javaで日本語1文字のバイト数
-
UTF-8コードの正規表現
-
【ActionScript】全角半角の判...
-
Console.writeLineで文字化け
-
memcmp バイナリデータの比較方法
-
UNICODE対応にするメリットは?
-
機種依存文字をチェックしたい。
-
CRC計算方法
-
SQLで1バイト、2バイト混在...
-
sizeof(long), sizeof(short)...
-
リトルエンディアンのデータを...
-
char str[256]の256の意味は?
-
varchar(M)のMは文字数ですかバ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルシート名の制限を変更...
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
COBOLのCOMP形式について
-
char str[256]の256の意味は?
-
バイト列とバイナリ列の違いが...
-
C++ Builderで文字列をバイトに...
-
VBAでShift-JISのURLエンコード
-
機種依存文字をチェックしたい。
-
「1TB」のHDDに日本語は何字入...
-
GetWindowTextでアドレスバーか...
-
ピクセル,dpiから容量(バイト...
-
【VB2005】テキストボックス内...
-
URLは最高何文字まで可能なので...
-
64bit対応
-
UCS-2の一覧表が欲しい
-
VBAでUnicodeしか存在しない文...
-
SQLで1バイト、2バイト混在...
-
ビットスワップとバイトスワッ...
-
CRC計算方法
おすすめ情報