天国にいけるC言語入門 ヘキサ構造体 ver5.2130
コンピュータのメモリにはなぜアドレスがつけられているのでしょうか?アスキーコードのようなものがつくられたのはなぜでしょうか?なぜ変数宣言のようなシステムが作られたのでしょうか?
なぜ変数宣言のようなメモリに自由に名前を付けるシステムがつくられたのでしょうか まずはここで基本的なことを学んでみましょう
コンピュータのメモリにはなぜアドレスがつけられているのでしょうか?アスキーコードのようなものがつくられたのはなぜでしょうか?なぜ変数宣言のようなシステムが作られたのでしょうか?
コンピュータのメモリにはなぜアドレスがつけられているのでしょうか?
アスキーコードのようなものがつくられたのはなぜでしょうか?
なぜ変数宣言のようなシステムが作られたのでしょうか?
アレサ「
では次のプログラムをご覧ください
#include < stdio.h>
#include < stdlib.h>
int main(void){
puts("Hello,World");
return EXIT_SUCCESS;
}
プログラムの実行結果
Hello,World
これは「Eclipse」という統合開発環境でかかれた
プログラムです。
「Eclipse」統合開発環境では
他の統合開発環境では
return 0;となっているところが
return EXIT_SUCCESS;と書かれている場合がおおいいですね。
特徴ですね。
ためしに私たちのつかっている統合開発環境で
上記のプログラムを実行しても
ちゃんと
プログラムの実行結果
Hello,World
が表示されます。
今のプログラムの中に
#include < stdlib.h>
と記述されていますね。
実は
return EXIT_SUCCESS;
を使用するには
#include < stdlib.h>
の記述が必要なのですが・・・
一体
#include < stdlib.h>
は何を意味しているのかというと・・・」
アレサ「はいっ
また別の情報が転送されてきました。
統合開発環境がちがうということは
その中のソースコードを機械語に翻訳する
コンパイラにも違いがあるというわけですね。
たとえば
コンピュータ内の
実数をもちいた計算において
計算結果を
小数点以下第6位に収める際
小数点以下第7位を
四捨五入するか そのまま切り捨てるかなど
具体的には
コンピュータ内で
数値計算
5.45678×3.45678=18.8628879684
が行われたとすると
この計算結果を
小数点以下第6位までを表示する
%f出力変換指定子をもちいて
コマンドプロンプト画面にprintf出力表示するとき
小数点以下第7位を四捨五入して
18.862888と表示するか
小数点以下第7位を切り捨てて
18.862887と表示するかは
処理系(コンパイラ)によってちがいがあります。
010101110101010100001010100・・・・
はい、
文字コードについて
なぜ
文字コード
(アスキーコードはいくつかある文字コードのうちの1つです
他にはユニコード
シフトJISコード
などなど
・
・
があります
文字コードは
文字データの画像データに数値データを割り当てる仕組みです
文字コードが違えば
同じ文字データでも異なる数値データが割り当てられることがあります)
のようなものがつくられたのか?
ですか・・・
こちらの世界で少し調べてみましょう。
ええと
解析をこころみます。
010111010100100101010101111・・・
コンピュータは0と1から作られたデータしか扱うことができないため
文字 例えば
文字Aという画像データも
+
¥
のような記号の画像データも
0と1のデータの集まりで作られています。
つまり
文字や記号は0と1のデータのあつまりで作られた
🍊画像データとして🍊
コンピュータにあつかわれています。
つまり
ディスプレイに表示された
文字とは画像データだったんですね・・・
コンピューターで文字をディスプレイに表示するとき
文字の画像データと数値(たとえばアスキーコード)を対応させておけば
数値を使って簡単に
文字の画像データをよびだし使用することができる・・
というところですか?
確かにこれは便利な方法ですね。
数値と文字の画像データを対応させておけば
その数値をつかって
簡単に 今この画面に表示されている文字を
呼び出せるというわけです。
では、これからが本質的なお話になると思うのですが・・・
0000000111//」
\\\\\\\\\\\______『『『『『『』』』」」」」」」---------
アレサ
「数値と文字の画像データの対応はどうしても
必要となってくるとおもわれます。
aという文字(画像データ)を表示するとき
自分でゼロから
aの画像データ
01010101000111010100000000000000000010010101010001110101000000000000000000100101000000000000000000000000000000000111111111111111111111101000000000010000001001111111111111111111111111111111111111111101000000000000000001010101010010100101001010000000000000000000000000000000001111111111111111111111010000000000100000010011111111111111111111111111111111111111111010000000000000000010101010100101001010010101010001110101000000000000000000100101000000000000000000000000000000000111111111111111111111010000000000100000010011111111111111111111111111111111111111111010000000000000000010101010100101001010
をうちこんでいたのでは とても手間がかかります。
そこで あらかじめパソコンに
このaの画像データを記憶させる。
そして aという画像データをパソコン内から
呼び出して使用する
そのとき
aという画像データ
に数値データをわりあてておいて
その数値データを用いて
aという画像データをパソコン内から
呼び出して使用する
という流れになっていくわけです。
ひとまず
数値(アスキーコード)と文字の画像データの対応のお話
はおいておきます。」
アレサ「ところで
実は
コンピュータ内のメモリに格納されているデータは
(1バイト)8ビットの単位ごとに
管理されています。
その(1バイト)8ビット単位のひとつひとつにアドレスという番号が
割り振られており
CPUがデータを呼び出すとき、そのアドレス番号をつかって
データを呼び出しています。」
アレサ「では ソーラーさんが
数値1などのデータをコンピュータのあるメモリに格納したとします。」
ソーラー「はい🌞」
アレサ「では ソーラーさんが
その数値1をコンピュータのあるメモリから
呼び出して使用したいとします」
ソーラー「はい🌞」
アレサ「どのように
数値1をコンピュータのあるメモリから
呼び出して使用しますか?」
ソーラー「はい?🌞
わかりません」
アレサ「つまり
たくさんあるメモリのうちの1つの8ビットの部分に
数値データ1が格納されているとします。
どうやって
たくさんあるメモリの中から
数値データ1を格納しているそのメモリ
をみつけることができるのでしょうか?」
ソーラー「勘です」
アレサ「勘 かもしれません。
🍋あるメモリにデータを格納して🍋
🍋そのデータを呼び出して使用する🍋
方法を昔の人もかんがえるわけですが・・・
コンピュータに命令をだしてメモリ内から
数値データ1を呼び出すには
🍅 メモリに番号をつけておいて 🍅
🍅 その番号を指定して 🍅
🍅数値データ1をとり出す方法以外考えられなかった 🍅
のではないでしょうか。
なぜか、どうやっても
<メモリに番号をつけるしか>
コンピュータがメモリ内から
数値データ1を呼び出す方法をみつけることができません。
000000000000000000000000000・・・
今 現在、わたし<アレサ>も
メモリに番号を付けないで
メモリ内に格納されている数値データ1を
呼び出す方法を考えているのですが
いまのところ おもいつきません。
みなさんにいいアイデアはありませんか?
メモリ内に格納されている数値データ1を
呼び出す方法ですか・・・
0001010101010010101010011111111・・・・・・
0111010100101???
01010101010・・・?
0111001・・・
数値データ1を呼び出すには・・・
0101010100111110101010010101010101000・・・???
??たとえば
メモリーDに数値データ1は記憶されているとします。
そこから
数値データ1を呼び出すには
そのメモリーDを指定するしか
数値データ1をとりだす方法が
ないのです
メモリーDを指定するにはメモリーDには名前がないと指定できません。
コンピュータは0と1しか理解できないので
メモリーDの名前は
必然的に0と1の組み合わせ(すなわち数値)
が対応することになります。
つまり数値データ1をとりだすとき
メモリーDにつけられた名前(たとえば00101010すなわち数値)を
よぶことになります。
すなわち
数値データ1をとりだすとき
ある数値が対応してくることになるのです。
01010111110101000101001010111・・・・・・・
メモリーDの名前(たとえば00101010)をつかって
(実は
コンピュータ内のメモリに格納されているデータは(1バイト)8ビットの単位ごとに
管理されています。
その(1バイト)8ビット単位のメモリのひとつひとつにアドレスという番号が
割り振られており
CPUがデータを呼び出すとき、そのアドレス番号をつかって
データを呼び出しています。)
00001010010101001111001010011・・・
数値データ1をとりだしたい
それには
>数値データ1が格納されているメモリーDの名前がいる。
>メモリーDの名前はコンピュータでも理解できる数値(たとえば00101010)で表すしかない
>メモリーDの名前にアドレス(たとえば00101010のような数値)
をつけたものの
00101010とプログラムに打ち込んで数値データ1を
よびだすのは面倒である
それに
数値データ1が保存されているメモリーの番号
00101010を覚えていないといけません
が
覚えておくのはとても大変です
そこで登場するのが変数宣言なのです。
変数宣言
int b;
を行うということは
メモリにbという名前を付けることに相当します
こうすることにより
メモリにつけられている(アドレス)数値で
データをよびだしたり格納したりしなくても
bという身近な名前で
データをよびだしたり格納したり
できるようになります
このとき
もともと
メモリにつけられている番号00101010は変数bという名前で
上書きされて消えるということはなく
ちゃんと残っています
数値1をメモリに格納したいとき
変数宣言というシステムがあれば
変数宣言
int b;
b=1;
をおこない
数値1を変数bの名前でメモリに格納でき
printf("%d",b);
で数値1をprintf出力表示することができますが
もし
変数宣言というシステムがなければ
もともと
メモリにつけられている番号
11001001
などで
数値データ1をメモリに格納したり
メモリから呼び出したりしなければならなくなるというわけです。
そして
変数宣言
int b;
b=1;で
メモリにbという名前を付けるとき
int b;
とint型(4バイト)を bの名前の左隣に表記することにより
1バイト×4つ分のメモリを bという名前でまとめて管理することが
できるようになります
ですので
int b;
b=1;
が行われると
1バイト×4つ分のメモリにわたって
このように
00000000 00000000 00000000 00000001
数値データ1は格納され
printf("%d",b);
がおこなわれると
bという名前でまとめて管理されている
1バイト×4つ分のメモリ内のデータ
00000000 00000000 00000000 00000001
が
整数値を表示する%d出力変換指定子をつかうことにより
コマンドプロンプト画面に
1としてprintf出力表示されるというわけですの
char b;
b=1;
が行われるならば
char型(1バイト)の変数bに格納される
数値1は
以下のように
00000001
と
1バイトのメモリに格納されます
そして
printf("%d",b);
が行われるわけですが
bという名前が付けられたメモリに格納されたデータ
00000001
が
%d出力変換指定子をつかうことにより
コマンドプロンプト画面に
1
が
printf出力表示されるというわけです
(実際には
printf("%d",b);
が実行されるとき
データ処理の関係上
bという名前が付けられたメモリに格納されたデータ
00000001
は
int型の形式
つまり
4バイトにわたって
00000000 00000000 00000000 00000001
と格納し直され
%d出力変換指定子をつかうことにより
コマンドプロンプト画面に
1
が
printf出力表示されることになります)
このように
変数宣言をおこない
メモリに名前をつけるのは
容易にデータをとりだすために
必要で自然なことなのでした。
ソーラー 「おお・・・
な~~~~んか楽しそうなことをやっておられますね。😊
アレサさん」
アレサ 「ようこそ いらっしゃいました。ソーラーさん」
ソーラー 「よばれて、とびでて、参上ぉおおおおおおお
でも
さっきからいました」
アレサ 「00000000000000000000111111111111・・・・」
ソーラー 「つまり、コンピュータがインダス文明時代に
つくられたとしても、
黄河文明時代につくられたとしても
🍓メモリに番号を付けることでしか🍓
🍓メモリに格納されたデータを呼び出すことができないんだね。🍓
そして
🍓 メモリに格納されたデータを
メモリにつけられた数値(アドレス)でよびだすのは煩雑なため
より簡単によびだせるよう
🍓 さらに変数宣言によりメモリに名前を付けるんだね 🍓
文字の画像データに数値(アスキーコード)
が対応しているのも
同様な理由からなんだね
次のプログラムのように→」
#include <stdio.h>
int main()
{
printf("%c\n", 97);
return 0;
}
プログラムの実行結果
a
ソーラー「→
文字の画像データaを
コマンドプロンプト画面に表示するとき
アスキーコード97が使用されているね。
このとき
コンピュータ内では文字aの画像データに割り振られた
01100001(10進数97 アスキーコード97)
が使用されています。
つまり
これは
文字の画像データaを
コマンドプロンプト画面に表示するとき
文字の画像データaをおさめた場所から
文字の画像データaをおさめた場所に付けられている数値(アドレス)で
文字の画像データaをよびださなくても
文字の画像データaに割り振られた
アスキーコードでよびだせるということなんだね。」
アレサ 「そのようになるかとおもわれます。」
ソーラー 「で・・・雑誌ASCIIの出現も・・・・必然・・・」
アレサ 「11111100000・・・き、きいていらっしゃたの・・・000000」
ソーラー 「はい、
ここでの 超重要事項は雑誌ASCIIの出現です。(笑)
雑誌ASCIIの出現は自然な流れなのです(笑)
なんかそんなの聞こえたかな~~~」
アレサ 「ああっ」
ソーラー 「ところで、
人間の脳ではデータの呼び出しはどうなっているのかな?」
アレサ 「11111100000・・人間の脳では・・・・・ですか???」
ソーラー 「コンピュータがデータをよびだすには
データを記憶しているメモリの
名前がいるけど・・・・
人間の脳の中にも
データを記憶しているメモリのようなものがあるはずだけど
名前はついてないよね・・・
脳の中の1111000番のメモリに格納されている画像データをよびだしまーす
というような仕組みになっていないのに
思い出したい景色を呼び出すことができる。
すごいことだね。
人が何かを思い出そうとするとき
どうやってデータをよびだしてるのかな?」
アレサ 「そうですね・・・0000000000000
皆さんを見ていて思うのですが
皆さんの
脳の記憶装置の中のメモリには
いろんなデータが何重にもかさなって
書き込まれてるような気がします・・・・・」
アレサ「ですから 記憶がまざりあう 変化するというようなことが
起こっていると おもわれますの・・・」
ソーラー「そうおもうんだ?」
アレサ 「
メモリに🍓アドレス(数値)🍓をつけるのは
自然にして必然、
変数宣言はとっても便利、変数宣言でメモリになまえをつけてね
のエピソードでした」
ソーラー「突然ここで終わりになる???」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます