2023年03月26日くいなちゃん


6さいからのプログラミング」第3話では、00~FFしか格納できないメインメモリ上で文字や巨大な数や小数などを扱う仕組みについて解説します!

1メインメモリ上の値

第2話までの講義で、メインメモリ上には00~FFの値しか置くことができないと説明しました。 しかし、もっと大きな数や、負の数や、小数や、文字などを扱いたいときがあります。 そこでこれらの値を、00~FFをうまく工夫することで表現しようと考えます。
例えば、わたしたちが普段使う10進数では、大きな数を表すときに「一の位」「十の位」といった桁で表現しますが、16進数の大きな数も同じ仕組みで表せます(図1-1)。
16進数の大きな数
図1-1: 16進数の大きな数
16進数の「2C5FA9」(10進数で2908073)という数は00~FFに入りきりませんが、メインメモリ上では「2C 5F A9」という3バイトの値に分割することで表せます。 ちなみに逆順にすると「A9 5F 2C」となりますが、逆順にする利点はいくつかあるため、現在ほとんどのPCやスマートフォンではメインメモリ上で逆順に格納されています。 逆順で表す方式を「リトルエンディアン」、元の順で表す方式を「ビッグエンディアン」といいます。
では、文字をメインメモリ上で表現したい場合はどうでしょうか。 「H」「E」「L」「L」「O」という5文字は、図1-2のように表すことができます。
文字と文字コード
図1-2: 文字と文字コード
00~FFが何の文字を表すかというルールをあらかじめ定めておいた「文字もじコード」というものを用意することで文字が表現できます。 文字コードにはいくつか標準的なものが存在していて、よく使われるものは「ASCIIアスキー」や「UTF-8ユーティーエフエイト」などです。 日本語にはひらがなや漢字などたくさんの文字の種類があるため、とても00~FFだけでは表しきれないので、数バイトで1文字を表現したりします。
また「H」「E」「L」「L」「O」の5文字を並べて一つのメッセージ「HELLO」とみなしたものを、文字の列という意味で「文字列もじれつ」といいます。 プログラミングでは文字と文字列は別物として区別します。 文字が複数集まったものが文字列です。

2

このように、同じ00~FFの並びでも、数値とみなしたり文字列とみなしたりできますが、メインメモリ上の並びをどうみなすかを「かた」といいます。 例えばメインメモリ上の「58 59 5A」という並びを、「整数型せいすうがた」では「58595A」という数値とみなし、「文字列型もじれつがた」では「XYZ」という文字列とみなします。
C言語では整数型のことを「int型イントがた」と呼びます。 しかし型の呼び方は言語によってばらつきがあります。 C言語、Java、Haskellにおける型を一部紹介します(表2-1)。
表2-1: 各言語における型の一部
型名 C言語 Java Haskell
整数型 int int Int
文字型 char char Char
文字列型 char* java.lang.String String
単精度浮動小数点型 float float Float
倍精度浮動小数点型 double double Double
論理型 古典的な規格には存在しない boolean Bool
単精度浮動小数点型たんせいどふどうしょうすうてんがた」は精度の低い小数を扱う型で、「倍精度浮動小数点型ばいせいどふどうしょうすうてんがた」は精度の高い小数を扱う型です。 精度が高いほどメインメモリをたくさん使います。 「論理型ろんりがた」は真偽を扱う型です。
基本的な型を紹介しましたが、実際にはC言語ではint型以外にも整数型が用意されていたりします。 メインメモリを無駄遣いしないために、用途に応じて最適な型が使われます。

3負の数

さて次は、負の数(0より小さい数)をメインメモリ上でどう扱うかについて解説します。 メインメモリ上で「A2 34」と表した場合、2バイトのビッグエンディアンでは「A234」という数値と考えることができますが、最初の1ビットをプラスマイナスの符号だとみなすと、負の数として扱うことも可能です。 最初の1ビットが0ならプラス、1ならマイナスだとすると、例えば「A2 34」は最初の1ビットが1なので負の数だとみなせます(図3-1)。
負の数
図3-1: 負の数
現在主流のコンピュータでは、「A2 34」は負の数では「-5DCC」となります。 なぜ -5DCC になるのかはともかく、このように最初の1ビットをプラスマイナスの符号と考えて -5DCC のように解釈する型を「符号付き整数型」といい、常にプラスと考えて全ビットで数値を表現し A234 のように解釈する型を「符号なし整数型」といいます。

4小数

次は小数についてです。 メインメモリ上で小数を扱うときは、多くの場合「浮動小数点ふどうしょうすうてん」という仕組みが用いられます。 これは、小数を「」という形で表すもので、小数点を動かして様々な数値を表現することからこの名前が付いています(図4-1)。
小数と浮動小数点
図4-1: 小数と浮動小数点
この例では、「0.875」という10進数の小数を、メインメモリ上で「3F 60 00 00」と表しています。 なぜそうなるのかは「IEEEアイトリプルイー 754」という規格で定められていますが解らなくて構いません。 多くの言語の浮動小数点型では、メインメモリを4バイト使う低精度のものと、8バイト使う高精度のものが用意されており、前者を単精度浮動小数点型、後者を倍精度浮動小数点型といいます。

5論理型

多くのプログラミング言語では、「しん」か「」のいずれかの値を扱うような型が用意されています。 これを「論理型」といいます。 用途としては、「ある条件が真ならばAを、偽ならばBを実行せよ」などの命令に使われます。
多くの言語では、メインメモリ上では偽を0、真を1として表現します。 ただしC言語の古典的な規格には論理型が存在しないため、整数型で代用します。 この場合、偽は「0」、真は「0以外」とします。

6リテラル

以上が型の概要になります。 この他にもたくさんの型が存在します。 プログラミングをするときは、今扱っている値が何の型であるかを意識することが大切です。 メインメモリ上の単なる並びが「何を表しているのか」を決めるのが型だからです。
言語によっては、型を自動的に推察してくれる仕組みや、状況に応じて型を自動的に変換する仕組みがあります。 しかしその場合でも、メインメモリ上がどうなっているのかを意識することで、不要な変換処理を減らすことができ、またバグを減らすこともできます。
最後に、それぞれの型の値をソースコード上で記す方法について解説します。 C言語では「5」という数値を表す場合、「5」と書けば整数型に、「5.0」と書けば倍精度浮動小数点型になります(表6-1)。
表6-1: C言語のリテラル
リテラルの例
int (整数型) 5
char (文字型) '5'
char* (文字列型) "5"
float (単精度浮動小数点型) 5.0f
double (倍精度浮動小数点型) 5.0
このように、値の書き方によってその値の表す型が変わります。 ソースコードに書かれたこのような値のことを「リテラル」といいます。 例えば、「"5"」は「文字列リテラル」です。
今回は、型とリテラルについて解説しました。 次回は、これらの型を活用して具体的なプログラムを書いていきます!
1679822350jaf