コンピューターサイエンス 学び直し データ編
今月からコンピューターサイエンスを学び直しているので、そのアウトプットをしようと思います。
そもそも、コンピュータサイエンスとは、「コンピュータを利用して様々な課題を解決する方法を研究する学問」と言えます。
コンピュータサイエンスが扱う分野は、プログラミング言語やフレームワークだけでなく、ハードウェアや設計パターン、アルゴリズムなど多岐にわたります。
これらを組み合わせ、最適な選択をし、社会的学術的な課題を解決していくことが、コンピュータサイエンスの本質です。
今回は、処理の元となる「データ」について解説していきます。
データ
「データ」とは、プログラムが扱う情報のことです。
例えば、計算するためにはデータ必要です。
それ以外のどのような処理も、基本的にはデータが必要です。
データ型
データ型とは、プログラミングにおいて使用されるデータの種類です。
プログラムで使用する情報によって、適切なデータ型を選択する必要があります。
しかし、適したデータ型を使用しないと、プログラムが予期しない動作をすることがあります。
例えば、1 + 1という処理を文字型で処理すると、2ではなく11になってしまいます。
このように、データ型を意識するというのは、バグを起こさないためにもとても大事です。
以下に、代表的なデータ型をいくつか挙げます。
- ブーリアン型(真偽値を表す)
- 整数型(整数を表す)
- 浮動小数点型(小数を表す)
- 文字型(1文字を表す)
- 文字列型(複数の文字列を表す)
ただ、データ型は使用するプログラミング言語によって多少変わります。
例えば、JavaScriptでは文字型というものは存在しません。
ビットとバイト
コンピュータは、 0 と 1 しか表せません。
なぜかというと、電流が流れているか流れていないかでしか区別できないからです。
そのため1 つの組み合わせだけでは、0, 1 の 2 通りしか表現できません。
そして、その最小単位をビット(bit)といいます。
表現できるデータを増やすには、ビットを増やすことが必要です。
例えば、2ビットの場合は2 × 2の4通りの表現ができます。
そして、8 ビットは2の8乗 = 256 通りの表現ができます。
この8ビットの固まりをバイト(byte)と呼びます。
進数表現
コンピュータの内部では、数値データは 2 進数で表現されます。
先ほども述べた通り、コンピューターにおいては電気が流れていない状態を0、流れている状態を1として扱います。
けれど、人間が 2 進数で数値を扱うことは非常に困難です。
なので、プログラム上では10進数を使用し、それをコンピュータにも理解できるように2進数に変換させるのが一般的です。
またこの進数の変換のせいで、少数を扱う場合は誤差が生じてしまう可能性がありますが、これは後で詳しく説明します。
なので、プログラムを扱う上で、このこともしっかりと把握しておく必要があります。
また16進数を使用することで、桁が減り2進数への変換も直感的にやりやすいので、人間が扱いやすくなります。
なので例えば、文字コードやカラーコードなどに16進数は使用されています。
整数型
一般的に、整数型は 32 ビット(4 バイト)の長さを持ちます。
そのため、整数型は2 進数で表現できる数値の最大値である 4,294,967,296(= 2の 32 乗)通りを扱えます。
そしてこれはint型の話で、さらに大きな数値を扱う場合はlong型をというデータ型を使用する必要があります。
このlong型はint型の倍の64ビットを扱うことができます。
なので、符号つき long 型の範囲は、-9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 までです。
符号なし long 型の範囲は、0から18,446,744,073,709,551,615 までです。
ちなみに2種類あるのは、メモリを節約するためです。
例えば、1という数値を表現するのに64ビットも使用するのは無駄です。
文字型
文字型は一般的にchar型と言います。
整数を2進数で表現するためには、10進数から変換させれば良いだけでしたが、文字の場合はどうでしょうか?
これは、簡単で文字と数値の対応表を作れば解決します。
例えば、65をhという文字に割り当てます。
そして、65を2進数に変換して、メモリに保存すれば文字も2進数で表現することができます。
既に世界的に決められた対応表を使用することで、他のコンピュータにも共通して同様の情報を与えることができます。
そして、これを文字コードと呼びます。
例えば、ASCII や Unicodeなどが代表的な文字コードになります。
ASCII は、西欧圏で使用されることを意図して作られたため、英語や数字、ラテン文字、記号に対してのみ対応表を作成しました。
なので、サイズは 7 ビットで2の7乗 = 128 通りの文字及び記号のみしか対応していませんでした。
そのため、日本語や中国語のような複雑な文字をビットを用いて表すことはできませんでした。
そしてUnicode は、世界中の言語で使われる文字を一つの規格で表現するための技術です。
その符号位置をコンピュータが理解できる 2 進数(16進数)にしたのが、 UTF です。
Unicode は符号化文字集合といい、UTF-8 などは文字符号化方式と呼びます。
つまり、Unicodeは文字と数値の対応表のこと、UTFは文字を2進数にエンコードする方式のことを言います。
Unicode は最初から世界中のすべての文字を登録したわけではなく、途中からマイナー言語や、過去に使われていた言語なども追加していきました。
その過程で当初想定していた枠を超えて表現しきれなくなってしまい、UTF-8、UTF-16、UTF-32 など複数の符号化方法が設定されてきました。
そして、UTF-8 が最も一般的に使用されます。
今回はUnicodeについて解説しましたが、日本語に適した Shift-JIS という別の文字コードが存在します。
そのため、UTF-8 で表現した文字を Shift-JIS で表示しようとすると、意図しない文字を出力することがあります。
これが文字化けの原因です。
文字列型
文字列型とは、特定の文字の並びを表現するためのデータ型です
文字列型は str 型と表記されることもあります。。
"Hello world” のような文字列は、プログラム上では一続きの文字列として表され、文字列型と呼ばれます。
つまり、プログラミング言語によっては ‘a’ のような文字と、"hello" のような文字列は異なるデータ型と認識されるため注意が必要です。
たとえば、文字型には長さの概念がありませんが、文字列型にはあります。
また、文字列型は文字列結合や検索などの操作が可能ですが、文字型はそのような操作ができないです。
10 進数と固定小数点型
小数を表現する方法の一つである「固定小数点型」について解説していきます。
固定小数点型は、小数点の位置が固定されているため、あらかじめ決められた枠内で数字を表現することができます。
例えば、正負の符号に 1 つ、整数部分を 5 桁、小数部分を 4 桁に設定して、少数を表現することができます。
指数表記
少数の話をさらに深掘りするために、指数表記について解説していきます。
指数表記を用いることにより、極端に大きいまたは小さい値でも、限られたビット数で表現することができます。
例えば、上記の2,000,000は2 × 10の6乗と表すことができます。
このため、大きな数値を扱う場合でも、指数表記を使用すればメモリを節約することができます。
以下に指数表記の用語を軽く解説しておきます。
仮数、指数、基数
指数表記では、数値を「仮数 × 基数のべき乗(指数)」として表現します。
例えば、3.4 × 10の38乗の場合、3.4 が仮数、10 が基数、38 が指数になります。
正規化
正規化とは指数表記において、仮数の最初の数字が 1 桁で表現されるように変換することです。
例えば、先ほどの例では1 桁目が 3 であるため正規化された形であると言えます。
浮動小数点型
浮動小数点は、小数点を指数表記によって動かすことができる数値のことです。
先ほど説明した、仮数、指数、基数を使用して、より多くの少数を表現できるようになります。
この浮動小数点型には、float 型と double 型があります。
こちらは、整数のintとロングのように扱えるビット数が32ビットか64ビットか変わります。
float 型
float 型は、32 ビットで表される単精度浮動小数点型です。
float 型は、約 7 桁分の値を保持することができます。表現できる値のおおよその範囲は、
- -3.4 × 1038 から -1.2 × 10-38
- 0
- 1.2 × 10-38 から 3.4 × 1038
double 型
double 型は、64 ビットで表される倍精度浮動小数点型です。double 型は、約 15 桁分の値を保持することができます。表現できる値のおおよその範囲は、
- -1.8 × 10308 から -2.2 × 10-308
- 0
- 2.2 × 10-308 から 1.8 × 10308
です。
このようにわずか 64 ビットで、非常に大きい数を表現することができます。
ただし、浮動小数点型は、すべての数値を正確に表現することはできません。
たとえば、10進数の0.1は2進数では無限の循環小数になります。
これを有限のビット数で表現しようとすると、近似値となるため、計算の過程で微小な誤差が蓄積していくことがあります。
そのため浮動小数点数は、より広範囲な数値を表現するための近似値として扱われます。
null/void
これまでに様々なデータ型を学んできましたが、コンピュータの世界ではデータが存在しないこと自体がデータとして扱われることがあります。
これをnullと呼びます。
null は、データを読み取る際にメモリに何も存在しないことを表します。
また、データ型そのものが存在しない状況もあります。
これを void と呼びます。
例えば、出力データを作成しないプログラムは、データ型を指定することができません。
このようなプログラムは通常、特定の処理を実行し、結果を出力せずに終了します。
この場合、void というキーワードが使用されます。
つまりvoidは、出力のデータ型がないことを示すために使用されます。
プリミティブ型
基本的なデータ型をプリミティブ型と呼びます。
多くのプログラミング言語で、以下のようなデータ型が提供されています。
- ブーリアン型 : bool
- 整数型 : int, long
- 浮動小数点数型 : float, double
- 文字型 : char
- 文字列型 : str
つまり、今まで説明してきたのは全てプリミティブ型です。
これらのデータ型をうまく使い分けることで、プログラムを効率的かつ正確に動作させることができます。
なので、プログラミングを学ぶ上で、これらの基本的なデータ型を理解することは非常に重要です。
リテラル
リテラルとは、ソースコードに直接書き込まれた文字や数字のことです。
コンピュータはデータの種類を識別する必要があるため、リテラルには特定の書式があります。
ただ、これもプログラミング言語ごとで多少変化します。
たとえば、文字リテラルを表記する場合、文字の前後をシングルクオーテーションで囲み、'a' のように記述する必要があります。
整数リテラルは、数字そのものをそのまま書きます。
2 進数の場合は、先頭に 0b を付けて表し、16 進数の場合は、先頭に 0x を付けて表します。
浮動小数点リテラルは、整数部分、小数点、小数部分を書きます。
または、指数表現を使って表すこともできます。
文字列リテラルは、文字列の前後にダブルクオーテーション(")をつけます。
論理値リテラルとは、真偽値(真または偽)を表すための書き方です。
たとえば、真を表す場合は true、偽を表す場合は false と書きます。
計算
次に、計算について解説していきます。
まずは用語の解説です。
今回は2 + 5を例に解説します。
+は演算子、 2 と 5 はオペランドと呼びます。
また、演算子とオペランドの組み合わせを式と言い、今回の式は 7 と評価されます。
そして、数学と同じように演算子には優先順位があり、その順番で処理されていきます。
例えば、()
> *,/,%
> +,-
のような優先順位があります。
また、異なる型同士の計算をする場合、多くのプログラミング言語では、より精度の高い型に自動的に変換されます。
例えば、小数点を含む計算において整数が使われる場合、整数は自動的に小数点を含む数値に変換されます。
しかし、除算を行う場合には注意が必要です。
異なる型同士の除算では、プログラミング言語によっては異なる結果が得られることがあります。
特に、整数同士の除算では、小数点以下が切り捨てられてしまうことがあります。
例えば、2 を 5 で割った結果は、Java や C++ のような言語では 0 となります。
一方、JavaScript や PHP、Python などでは、小数点以下も含めた 0.4 という結果が得られます。
このような計算結果の違いは、プログラムにバグを生じさせる原因となることがあります。
そのため型変換や除算には十分注意する必要があります。
また、通常加算演算子「+」は、数値のオペランドに使われます。
しかし、この場合は文字列に適用されています。
このように、オペランドのデータ型に応じて演算子の機能が変わることを演算子のオーバーロード(overload)と呼びます。
今回説明してきたように、プログラム言語やデータ型によって計算の結果が変わってくることがあるので、ここは十分な注意が必要です。
まとめ
今回はプログラムの基本となる「データ」について解説しました。
引き続き学んだ内容をアウトプットしていこうと思うので、参考にしてください。
宣伝
0からエンジニアになるためのノウハウをブログで発信しています。
また、YouTubeでの動画解説も始めました。
インスタの発信も細々とやっています。
興味がある方は、ぜひリンクをクリックして確認してみてください!
Discussion