天国にいけるC言語入門 ヘキサ構造体 ver5.2130
半角英数字が1バイト、全角文字のデータが2バイトに格納されているとはどういうことなのでしょうか 数値から画像データを呼び出すのが%c出力変換指定子の役割なのです
半角英数字が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バイト)
0000000001100010(2バイト)
0000000001100011(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の画像データなら0000000001100001
bの画像データなら0000000001100010
cの画像データなら0000000001100011
という具合にです
0000000001100001
0000000001100010
0000000001100011
は
10進数では
98
99
100
に相当します
16ビットのデータ量で表される
0000000001100001 (10進数では98)
0000000001100010 (10進数では99)
0000000001100011 (10進数では100)
👆
これらのデータはユニコードとよばれます
この
ユニコード
0000000001100001 (10進数では98)
0000000001100010 (10進数では99)
0000000001100011 (10進数では100)
を利用して半角英数字の画像データ
a
b
c
を呼び出すことができます
ですが
アスキーコードを利用して半角英数字の画像データを呼び出すという方法は現在でもつかわれています
つまり
アスキーコードを利用して半角英数字
a
b
c
の画像データを呼び出すという方法
と
ユニコードを利用して半角英数字
a
b
c
の画像データを呼び出すという方法
が両方存在しているというわけです
今は
2バイトのメモリに画像データに対応する数値(番号)を格納するのが
主流になっています。
繰り返しになりますが
それらの画像データに対応する数値(番号)は
🌞ユニコード🌞
とよばれています。
2バイトのメモリに画像データに対応する数値(番号)を格納するので
最大で65536個の文字の画像データに
数値(番号)を割り当てることができます
(2バイトのメモリでは65536個の数値データを表現することができます)
ですが
🍎 🍊 😻 🐟 🍰 🐤 🌻 🌊 💦(すべて2バイト文字)
(これらの可愛い絵文字は2バイト文字なので全てユニコードとよばれています)
こんな新しいタイプの文字がどんどんでてきているから
2バイトでは
新しい文字に割り振るための数値が不足し
いつか
すべての文字の画像データには3バイト分の数値データが割り振られる日が
くるんじゃないかな?」
アレサ「🍰は確か環境依存文字と呼ばれる文字でしたね。
環境依存文字は
ユーザーの環境によって
表示できたりできなかったりする文字のことですね。
パソコンで🐤などのような環境依存文字がうちこまれたファイルを
スマートフォンで閲覧すると文字化けがおこったりしていますね。
今回は
半角英数字が1バイト、全角文字のデータが2バイトに格納されているとはどういうことかを
みんなでたのしく推察してみました。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます