コンピュータサイエンス学び直し -データについて-

# 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進数の組み合わせがどの文字に対応するか**」というルールを決める必要があります。このルールを **「文字コード」** と呼びます。  

## 代表的な文字コード  

1. **ASCII (American Standard Code for Information Interchange)**  
   - 7ビット（128種類の文字）で表現  
   - 英語のアルファベット、数字、記号のみ対応  

2. **JIS (日本産業規格)**  
   - 日本語の文字（漢字、ひらがな、カタカナ）を表現するための規格  

3. **Shift-JIS**  
   - JISをベースにWindows環境向けに拡張された文字コード  

4. **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. **符号ビット（1ビット）**  
   - 5.75 は **正の数** なので **0**  

2. **指数部（8ビット）**  
   - 101.11 を **1.0111 × 2²** に変換（正規化）  
   - IEEE 754では **バイアス値127** を加えて保存する  
   - `2 + 127 = 129`  
   - 129を2進数で表すと `10000001`  

3. **仮数部（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進数で管理される。**