しゃお~ん🐈

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



solarplexuss

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


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


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


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


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


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


あの英字aや数値1


のことだよね。


もし


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


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


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


まあ、当然かな😊」


アレサ「8ビットなら


0もしくは1を並べて


00100000や10000001のように


8つ分おさめることができるのでした。


そして


メモリ内に収められた


00000000は数値0

00000001は数値1

00000010は数値2

.

.

.

11111111は数値255に対応しているのですの」


ソーラー


「数値aは1バイトのデータ量をもつってどういうことかな・・・???



数値aの


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





                  a




よ~くみてよ


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


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


solarplexuss


「この  a の



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


0と1を8ビット分


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


どうなってるのかな?」


アレサ

「仮に


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


次のような表示枠


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□


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


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


半角英数字1文字を


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□


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


半角英数字1は


□□□■□□□

□□□■□□□

□□□■□□□

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

□□□■□□□


半角英数字aは


■■■■■■■

□□□□□□■

■■■■■■■

■□□□□□■

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


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


ここまではいいですか?


ここで


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

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

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□■


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□■□


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□■■


.

.

.

.

■■■■■■■

■■■■■■■

■■■■■■■

■■■■■■■

■■■■■■■


全部で

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


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


👇

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

横に並べてみます


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


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□の部屋が35個ならんでいるのに相当します


□を0

■を1で表現するなら


さきほどの

■で塗りつぶすパターン


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□■


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□■□


□□□□□□□

□□□□□□□

□□□□□□□

□□□□□□□

□□□□□■■


.

.

.

.

■■■■■■■

■■■■■■■

■■■■■■■

■■■■■■■

■■■■■■■


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


00000000000000000000000000000000000(35ビット)

00000000000000000000000000000000001(35ビット)

00000000000000000000000000000000010(35ビット)

.

.

.

.

.

11111111111111111111111111111111111(35ビット)


であらわされます


半角英数字aを


■■■■■■■

□□□□□□■

■■■■■■■

■□□□□□■

■■■■■■■ 


で表し


□を0

■を1で表現するなら


1111111

0000001

1111111

1000001

1111111


11111110000001111111110000011111111


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


つまり


半角英数字aを


0と1で表現するのに


0と1の並びを格納する


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


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


つまり


8ビットという少ない容量では


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


ですから


半角英数字aは


1バイト文字といっても


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


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



半角英数字a

半角英数字b

半角英数字cなどには


番号が割り振られていて


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


‭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

と記憶させると


‭01100001‬

‭01100010‬

‭01100011‬


をメモリに記憶させることになり


もうこれだけで


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


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


もし


半角英数字に対応する数値(番号)を


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


コンピュータのメモリに

a

b

c

と記憶させると


‭0000000001100001‬

00000000‭01100010‬

00000000‭01100011‬


をメモリに記憶させることになり


もう10バイトのうち


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


でも


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


表示できる文字に制限があるので


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


2バイトのメモリに文字に対応する数値(番号)をおさめるようになった



今なら


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


メモリに容量があるので


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


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


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


ところで


今は


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


主流になっています。


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


        

         🌞ユニコード🌞



とよばれています。


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


最大で65536個の文字の画像データに対応する数値(番号)を


格納することができるけど


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


(これらの可愛い文字は全てユニコードとよばれています)


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


いつか


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


くるんじゃないかな?」



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


環境依存文字は


ユーザーの環境によって


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


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


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


今回は


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


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




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

作者を応援しよう!

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

応援したユーザー

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