1. はじめに
エンジニアとして3年が経過しようとしている中、技術を使ってより高度な問題解決をしていくためには、フレームワークや言語に依存しない基礎となる知識が必要だと感じたため、CSを勉強し直しています。
その学習内容を備忘録として発信します。
第1回目はデータについてです。
2. データとは
データとは、コンピューターが処理や保存を行うために扱う情報のことを指します。具体的には、数値、文字、画像、音声、動画など、さまざまな形で表現される情報の単位です。
コンピューターはこれらのデータを 「0」と「1」の2進数 で表現し、演算や記録、通信などの処理を行います。データは、その性質や用途に応じてさまざまな形式で整理され、適切な方法で管理されます。
3. ビットとは
コンピューターはデータを「0」と「1」で扱います。これは 「2進数(バイナリ)」 と呼ばれる方式で、電気信号のON(1)とOFF(0) を利用して情報を表現します。この仕組みにより、ハードウェアの設計が単純化され、処理の高速化や小型化が実現されました。
また、0と1の組み合わせを増やすことで、より多くの情報を効率的に表現できるようになり、現代のコンピューター技術の基盤となっています。この組み合わせの最小単位を 「ビット(bit)」 として管理します。
ビット数と表現できる状態
ビット数 | 表現できる状態の数 | 例 |
---|---|---|
1ビット | 2種類 (2¹ = 2) | 0, 1 (電気のON/OFF) |
2ビット | 4種類 (2² = 4) | 00, 01, 10, 11 |
3ビット | 8種類 (2³ = 8) | 000, 001, 010, 011, 100, 101, 110, 111 |
このように、ビット数が増えるほど、より多くの情報を扱えるようになります。
4. データ型とは
コンピューターが扱うデータの種類が増えると、それが数値なのか、文字なのか、あるいは他の情報なのかを明確に識別する必要が出てきます。
例えば、「123」というデータがあった場合、それが数値としての「123」なのか、それとも文字列としての「123」なのかによって、処理方法が異なります。そのため、データの種類を分類し、それぞれ適切に処理できるようにするための「データ型」 という概念が生まれました。
データ型を定義することで、コンピューターはデータの性質を理解し、それに応じた演算や操作を正確に行うことができます。
主なデータ型と特徴
データ型 | 内容 | 利用場面 | 具体例 | 備考 |
---|---|---|---|---|
Boolean型 | 「true(真)」と「false(偽)」で表現 | 条件分岐 |
if (isReady) { ... } のような条件判定 |
Yes/Noの判定に使われる |
整数型 | ビットの組み合わせを増やし、10進数に変換して整数を表現 | 整数のデータを扱うとき |
1 , -42 , 1000 など |
「符号付き」「符号なし」で扱える範囲が変わる |
文字列型 | ビットの組み合わせを文字と対応させた文字コードを使って文字を表現 | 文字(漢字、カタカナ、ひらがな、英語、数字、記号、絵文字など)の表現 |
"Hello" , "こんにちは" , "123" など |
文字コードの違いにより文字化けが発生する可能性がある |
浮動小数点数型 | 小数を2進数で表現する際、「符号部」「仮数部」「指数部」の3領域を用いてデータを格納 | 大きな数値や細かい数値を効率的に管理したい場合 |
3.14 , -0.001 , 1.0e10 など |
計算時に誤差が発生することがある |
4-1. 文字コードについて
コンピューターは、内部ではすべてのデータを0と1の2進数で処理します。しかし、文字を扱うためには「どの2進数の組み合わせがどの文字に対応するか」というルールを決める必要があります。このルールを 「文字コード」 と呼びます。
代表的な文字コード
-
ASCII (American Standard Code for Information Interchange)
- 7ビット(128種類の文字)で表現
- 英語のアルファベット、数字、記号のみ対応
-
JIS (日本産業規格)
- 日本語の文字(漢字、ひらがな、カタカナ)を表現するための規格
-
Shift-JIS
- JISをベースにWindows環境向けに拡張された文字コード
-
EUC-JP
- Unix系システムで広く使われた日本語文字コード
Unicodeとは?
世界中の文字を統一した規格として、Unicode が登場しました。Unicodeは、各文字に 一意の番号(コードポイント) を割り当て、異なる言語の文字を一つの規格内で統一して管理できるようにしました。
例えば、
-
A
→U+0041
-
あ
→U+3042
-
😀
→U+1F600
UTF-8とは?
Unicodeをデータとして保存・送信する方法の一つが UTF-8 です。UTF-8は可変長エンコーディングを採用しており、文字によって使用するバイト数が異なります。
- ASCII範囲の文字(A, B, C など) → 1バイト
- 日本語の文字(あ, 漢 など) → 3バイト
- 絵文字(😀, 🚀 など) → 4バイト
このように、**Unicodeは「文字とコードポイントの対応を定めた規格」**であり、 UTF-8は「そのコードポイントを実際に保存・送信する方法」 です。
4-2. 浮動小数点数とは?
4-2-1. 浮動小数点数の定義
浮動小数点数(floating-point number) とは、小数を表現するために用いられる数値表現の一種です。コンピュータ内部では、符号部(sign bit)・指数部(exponent)・仮数部(mantissa) の3つの部分に分けて管理されます。
これにより、非常に大きな数や小さな数を効率的に表現できる特徴があります。
4-2-2. なぜ浮動小数点数が必要なのか?
コンピュータは基本的に 2進数(0と1の組み合わせ) で数値を扱います。しかし、整数だけでは科学技術計算や金融計算などで小数を扱うことができません。そのため、小数を表現する方法として「固定小数点数」と「浮動小数点数」の2種類が考えられます。
- 固定小数点数(fixed-point) は、小数点の位置を固定した表現方法ですが、非常に大きな数や小さな数を扱うのが難しく、範囲が限られます。
- 浮動小数点数 は、小数点の位置を柔軟に動かすことで、広い範囲の数値を表現できるため、科学技術計算などに適しています。
例えば、天文学の超大きな数 や 量子力学の極小な数 などを扱う場合、固定小数点数では対応が困難ですが、浮動小数点数ならば効率的に表現可能です。
4-2-3. 具体例(「5.75」を浮動小数点数で表現する方法)
IEEE 754 単精度(32ビット)の浮動小数点数を例に説明します。
(1) 10進数を2進数に変換
まず、5.75を2進数に変換します。
-
整数部分 5 の2進数表現:
- 5 ÷ 2 = 2 ... 1
- 2 ÷ 2 = 1 ... 0
- 1 ÷ 2 = 0 ... 1
→101 (2進数)
-
小数部分 0.75 の2進数表現:
- 0.75 × 2 = 1.5 → 1
- 0.5 × 2 = 1.0 → 1
→.11 (2進数)
したがって、
5.75 (10進数)
= 101.11 (2進数)
となります。
(2) IEEE 754 フォーマットに変換
IEEE 754単精度(32ビット)は、以下の3つの部分で構成されます。
符号部 | 指数部 (8ビット) | 仮数部 (23ビット) |
---|---|---|
1ビット | 8ビット | 23ビット |
-
符号ビット(1ビット)
- 5.75 は 正の数 なので 0
-
指数部(8ビット)
- 101.11 を 1.0111 × 2² に変換(正規化)
- IEEE 754では バイアス値127 を加えて保存する
2 + 127 = 129
- 129を2進数で表すと
10000001
-
仮数部(23ビット)
-
1.0111
の小数部分を記録 -
01110000000000000000000
(後ろはゼロで埋める)
-
(3) 最終的なIEEE 754表現
IEEE 754単精度浮動小数点数(32ビット)として表すと
0 | 10000001 | 01110000000000000000000
4-2-4. まとめ
- 浮動小数点数 は、小数を表現するために 符号部・指数部・仮数部 に分かれた数値表現である。
- これにより、非常に大きな数や小さな数を扱うことが可能 になり、科学技術計算や金融計算において必須の技術である。
- 指数にバイアスを加える理由 は、指数を符号なし整数(unsigned integer)として扱い、計算を簡略化するためである。
- 5.75(10進数)をIEEE 754単精度浮動小数点数に変換すると、
0 10000001 01110000000000000000000
という2進数で管理される。