半角英数字が1バイト、全角文字のデータが2バイトに格納されているとはどういうことなのでしょうか  数値から画像データを呼び出すのが%c出力変換指定子の役割なのです 



solarplexuss

「今日は よく、いろんな書物にみられる


半角英数字が1バイト、全角文字のデータが2バイトに格納されている


とは どういうことなのかを


みんなで楽しく考察してみます。」


ソーラー「半角英数字って


コマンドプロンプト画面やこのカクヨムにも表示されている


あの英字aや数値1


のことだよね。


もし


半角英数字のデータが1バイトであらわされているのなら


英字aや数値1のデータも


1バイトつまり8ビットに収められているということになるよね


まあ、当然かな😊」


アレサ「8ビット分のメモリなら


0もしくは1を並べて


00100000や10000001のように


8つ分


0か1を格納することができるのでした。


そして


メモリ内に収められた


00000000は数値0

00000001は数値1

00000010は数値2

.

.

.

11111111は数値255


に対応しているのですの」


ソーラー


「数値データ(0から255までの数値)が1バイトに格納されるのはわかるんだけど



半角文字aは1バイトつまり8ビットのデータ量をもつってどういうことかな・・・???



う~ん ちょっと わかんないな・・・


半角文字aの


形状をじっと観察してみると・・・





                  a




よ~くみてよ


この半角文字aを0と1だけを8ビット分もちいて


あらわすことができるかな?」


solarplexuss


「う~んん(^^♪



        半角文字aは1バイトのデータ量をもつ


か・・・


この  


          a


という文字には綺麗に曲線を描いてる部分があるよね


この


なめらかなカーブの形状を


0と1を8ビット分


つまり


0か1を8個だけ用いて


表現することはできないような気がするんだけど


どうなってるのかな?」


アレサ

「仮に


半角英数字1文字はパソコン画面上で


次のようなドット表示枠


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□


の中で表されるとします。


(実際にはもっと□の数,ドットの数はおおいです。)


半角英数字1文字を


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□


このドット枠の□を黒く塗りつぶして表現していきます。


半角英数字1は


□□□■□□□

□□□■□□□

□□□■□□□

□□□■□□□  1にみえるかな?

□□□■□□□


半角英数字aは


■■■■■■■

□□□□□□■

■■■■■■■

■□□□□□■

■■■■■■■  aにみえますか?


このように表現されます。


ここまではいいですか?


ここで


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

■で塗りつぶすパターンは

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□■


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□■□


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□■■


.

.

.

.

■■■■■■■

■■■■■■■

■■■■■■■

■■■■■■■

■■■■■■□


■■■■■■■

■■■■■■■

■■■■■■■

■■■■■■■

■■■■■■■

👆

のように

全部で

2の35乗通りものパターンがあります。


ちょっとわかりにくいので


👇

□□□□□□□1

□□□□□□□2

□□□□□□□3

□□□□□□□4

□□□□□□□5

横に並べかえてみます


□□□□□□□1□□□□□□□2□□□□□□□3□□□□□□□4□□□□□□□5


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□の部屋が


□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□


のように


横に35個ならんでいるのに相当します


さきほどの

■で塗りつぶすパターン


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□■


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□■□


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□■■


.

.

.

.

■■■■■■■

■■■■■■■

■■■■■■■

■■■■■■■

■■■■■■■



□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■■


.

.

.

.

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


と並べ替えられます😊



□を0

■を1で表現するなら


さきほどの

■で塗りつぶすパターン


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□■


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□■□


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□■■


.

.

.

.

■■■■■■■

■■■■■■■

■■■■■■■

■■■■■■■

■■■■■■■


これらの2の35乗のパターンは


最終的には


00000000000000000000000000000000000(35ビット)

00000000000000000000000000000000001(35ビット)

00000000000000000000000000000000010(35ビット)

00000000000000000000000000000000011(35ビット)

.

.

.

.

.

11111111111111111111111111111111111(35ビット)


であらわされます


半角英数字aを


■■■■■■■

□□□□□□■

■■■■■■■

■□□□□□■

■■■■■■■ 


で表し


□を0

■を1で表現するなら


1111111

0000001

1111111

1000001

1111111

横に並べると

11111110000001111111110000011111111


で表されることになります。


つまり


半角英数字aを


0と1で表現するのに


0と1の並びを格納する


35ビットのお部屋が必要となり


8ビットでは半角英数字aを表現しきれません。


つまり


8ビットという少ないデータ容量


8ビット分のお部屋


では


画面の枠内にaを表示することはできないというわけです。


ですから


半角英数字aは


1バイト文字といっても


8ビットの0と1だけを用いて直接表現されているわけではないのです。」


ソーラー「そうなると 考えられる可能性は



半角英数字a

半角英数字b

半角英数字c

などには


番号が割り振られていて


その番号が1バイトのメモリに格納されているのじゃないのかな


半角英数字a

半角英数字b

半角英数字c

に対応する番号は


‭01100001‬

‭01100010

‭01100011‬

って

こんな感じかな?


この番号をつかって


半角英数字a

半角英数字b

半角英数字c

の画像データが呼び出される


そういう仕組みなんじゃないかな」


solarplexuss「


いいかえてみると


どこかに

半角英数字a

半角英数字b

半角英数字c


の画像情報が作製、保存されていて


その画像情報

半角英数字a

半角英数字b

半角英数字c


に番号がつけられているというわけです。


そして


半角英数字aの画像データを呼び出したいなら


半角英数字aに割り振られた数値、番号をつかえばよいというわけです。


そのとき


  🍒その数値を%c変換指定子を用いてprintf出力表示すると🍒



🍒その数値に対応した文字がコマンドプロンプト画面に表示されます🍒




つまり


半角英数字のデータが1バイトに格納されている


とは


半角英数字aの画像情報が直に1バイト分の0と1で表現されているのでなく


半角英数字aの画像情報に割り振られた数値(番号)が1バイト(8ビット)


のメモリに


‭01100001‬と


格納されているというわけです。」


ソーラー「あっ もしや


半角英数字aに割り振られた番号って


もろ アスキーコードのことじゃないかな」


solarplexuss

「となると


1バイトは


0から255までの256個の数値しか格納できないので


半角英数字の画像情報は0から255までしか番号づけることができず


1バイト文字である半角英数字は


最大で256個しか存在しないことになるのです。


ね、ね、(´▽`*)/ そうじゃない?



ソーラー「確かにアスキーコードは


256個もなかったような・・・


127個だったね


その中で


文字を表示するときに使用されるアスキーコードは


確か・・・


アスキーコード32は空白スペース、


アスキーコード33から126は文字の画像データだったような」


solarplexuss「なんで そんなことしってるの?


すごくない?」


ソーラー「いえ、どこかでみたことがあるんです。


どこだったかな?


それにしても~


なんかchar型の形式でメモリに格納できる数値の範囲


-128から127をみておもったんだけど


127とアスキーコードの数127が一致しているね。」


solarplexuss「同様に


全角文字のデータが2バイトに格納されているとはどういうことなのか


もわかってきます。


全角文字は ひらがなやカタカナ、漢字、など


たくさんのタイプのデータがあります。


漢字だけでも1万文字はあるでしょうか?


全角文字のデータが2バイトに格納されているとは


半角文字のときと同様に


それら全角文字の画像データを


2バイト分の16個の0と1で直接表現しているのではなく


ひらがなやカタカナ、漢字の画像情報に


割り振られた番号を


2バイトのメモリに


このように


0001000101100000


格納しているというわけです。



2バイトは0から65535までの数値を格納できます


その0から65535の数値に対応するように画像データを対応させるので


2バイト文字である全角文字も最大で


65536文字しか存在できないことになるわけです。


ね!ね!どう? よくない? このアイデア?」


ソーラー「そうだね


でも もしかしたら


実際には1バイト文字、2バイト文字の区別は必要ないのかも


しれないね。


画像データに割り振られた番号は


すべて10バイトのメモリに格納してもいいわけだし。


もしかしたら、これはデータ容量が極端に少なかった


コンピュータ初期の時代のシステムの名残なのかな?


昔は2バイトでもコンピュータのメモリに記憶させるには


かなりおおきなデータ容量だったのかも?


だから


当初は


1バイトのメモリに格納される数値(番号)に対応する


半角英数字


つまり


アスキーコード32(空白スペース)

アスキーコード33から126に対応する文字しか


つかわれなかったんじゃないかな?


例えば



極端な例で


コンピュータのメモリ容量が10バイトしかないとするよ。


そのとき


文字

a

b

c

をコマンドプロンプト画面に表示したいとします


文字

a

b

c

の画像データを呼び出して使用するには


アスキーコード

‭01100001‬

‭01100010‬

‭01100011‬

を使用します


そこで


コンピュータのメモリに


‭01100001‬

‭01100010‬

‭01100011‬


をメモリに記憶させることになるんだけど


もうこれだけで


3バイトも使用されてしまうからね。


コンピュータもフリーズしちゃいそうだね。」


solarplexuss「うっわ ほんとうだ」



ソーラー「


もし


半角英数字の画像データに対応する数値(番号)を


1バイトでなく

2バイトのメモリにわたって格納していたなら


コンピュータのメモリに


‭0000000001100001‬(2バイト)

00000000‭01100010‬(2バイト)

00000000‭01100011‬(2バイト)


を記憶させることになり


もう10バイトのうち


6バイトも使用されてしまうからね。


そこで


1バイトのメモリに文字の画像データに対応する数値(番号)をおさめていたのだけど・・・


けど


でもね


1バイトのメモリに文字の画像データに対応する数値(番号)をおさめていたのでは


表示できる文字が最大でも255個と限りがあります


他にもアスキーコードに対応する英字や記号だけでなく


ひらがな、カタカナ、漢字なども使いたくなってきます


そこで


メモリに余裕が出てくると


ひらがな、カタカナ、漢字などの画像データに


2バイト分の数値データ


つまり


0もしくは1が16個用いられた


数値データ


たとえば


0001101010100011のようなものを


割り振り


その画像データに割り振られた数値データをもちいて


ひらがな、カタカナ、漢字を表示するようになりました



今なら


画像データに対応する数値(番号)をいくらでも格納できるほど


メモリに容量があるので


10バイトのメモリにわたって画像データに対応する数値(番号)を格納してもいいかもしれないけど


メモリの無駄遣いになるからそんなことはしないかな。


さすがにメモリを使いすぎると


もしかしたら


コンピュータがメモリ不足でフリーズするかもしれないからね。


ところで


もともと


a,b,c,+,-,*・・・の画像データに付けられた番号(アスキーコード)は


1バイト分のデータ量を持っていました


a‭の画像データなら‭01100001‬ (10進数では98) 

b‭の画像データなら‭01100010 (10進数では99)

c‭の画像データなら‭01100011‬ (10進数では100)


のようにです


2バイトのメモリに


ひらがな、カタカナ、漢字などの画像データに対応する数値(番号)をおさめるようになったので


それにあわせ


半角英数字の画像データにも2バイト分の数値を対応させることにしました


a‭の画像データなら00000000‭01100001‬

b‭の画像データなら00000000‭01100010

c‭の画像データなら00000000‭01100011‬


という具合にです


00000000‭01100001‬

00000000‭01100010

00000000‭01100011‬


10進数では

98

99

100

に相当します



16ビットのデータ量で表される


00000000‭01100001‬ (10進数では98)

00000000‭01100010 (10進数では99)

00000000‭01100011‬ (10進数では100)


👆


これらのデータはユニコードとよばれます


この


ユニコード

00000000‭01100001‬ (10進数では98)

00000000‭01100010 (10進数では99)

00000000‭01100011‬ (10進数では100)


を利用して半角英数字の画像データ


a

b

c


を呼び出すことができます


ですが


アスキーコードを利用して半角英数字の画像データを呼び出すという方法は現在でもつかわれています


つまり


アスキーコードを利用して半角英数字


a

b

c

の画像データを呼び出すという方法



ユニコードを利用して半角英数字


a

b

c

の画像データを呼び出すという方法


が両方存在しているというわけです



今は


2バイトのメモリに画像データに対応する数値(番号)を格納するのが


主流になっています。


繰り返しになりますが


それらの画像データに対応する数値(番号)は


        

         🌞ユニコード🌞



とよばれています。


2バイトのメモリに画像データに対応する数値(番号)を格納するので


最大で65536個の文字の画像データに


数値(番号)を割り当てることができます



(2バイトのメモリでは65536個の数値データを表現することができます)

ですが


🍎 🍊 😻 🐟 🍰 🐤 🌻 🌊 💦(すべて2バイト文字)


(これらの可愛い絵文字は2バイト文字なので全てユニコードとよばれています)


こんな新しいタイプの文字がどんどんでてきているから


2バイトでは


新しい文字に割り振るための数値が不足し


いつか


すべての文字の画像データには3バイト分の数値データが割り振られる日が


くるんじゃないかな?」



アレサ「🍰は確か環境依存文字と呼ばれる文字でしたね。


環境依存文字は


ユーザーの環境によって


表示できたりできなかったりする文字のことですね。


パソコンで🐤などのような環境依存文字がうちこまれたファイルを


スマートフォンで閲覧すると文字化けがおこったりしていますね。


今回は


半角英数字が1バイト、全角文字のデータが2バイトに格納されているとはどういうことかを


みんなでたのしく推察してみました。」




  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る