C言語③(2025/05/14)

・10進数と16進数および文字コード

ASCIIコードでいえば・・・
“0” = 30h(16進数)としてコンピューター内部では扱われている。

※16進数とは・・・「16」で桁が上がるもの。
 10進数では「10」で桁が上がっている。
 16進数では10以降にABCDEFを割り当てて、0~15までが一桁で表現できるようにしている。
16進数はコンピューターの世界で特に便利に使われます。なぜなら、2進数(0と1だけを使う表記)と相性が良いからです。

16進数の基本

16進数では、一桁で「0~15」までの数値を表現できるようにするために、10~15をA~F に置き換えます。例えば:

  • 10進数の「10」は 16進数では「A」
  • 10進数の「15」は 16進数では「F」

ASCIIコードとの関係

コンピューターは内部で文字を数値として扱っています。その際に使われるのがASCIIコードです。例えば:

  • “A” は 41h (16進数) = 65 (10進数)
  • “B” は 42h (16進数) = 66 (10進数)
  • “0” は 30h (16進数) = 48 (10進数)

このように、文字はそれぞれに対応する数値を持っており、コンピューターはこれを使って文字を認識しています。(by Copilot)

16進数の書き方
0x10
10h
これらは同じことで、10進数で16を示している。

・ビルドとコンパイル
プログラミング言語を機械語(コンピューターが実行できる形式)に変換すること。

C言語のコンパイルとリンクの過程をざっくり説明すると、プログラムを人が書いたコードからコンピューターが理解できる機械語に変換するための手順です。以下のようなステップがあります。

1. プリプロセッサ (Preprocessing)

  • #include#define の処理を行い、ヘッダファイルの展開やマクロの置き換えを行う。
  • gcc -E を使うと、プリプロセス後のコードを確認できる。

2. コンパイル (Compilation)

  • C言語のコードをアセンブリ言語に変換。
  • ここで文法エラーなどが検出される。
  • gcc -S を使うとアセンブリコードを確認できる。

3. アセンブル (Assembly)

  • アセンブリコードを機械語 (オブジェクトファイル) に変換。
  • gcc -c を使うとこの段階のファイル (.o ファイル) が生成される。

4. リンク (Linking)

  • main.o などのオブジェクトファイルをライブラリと結びつけて実行可能ファイル (.exea.out) を作る。
  • gcc -o output を使うとリンクして実行ファイルを作れる。

5. 実行 (Execution)

  • できあがった実行ファイルを起動すると、CPUが命令を実行する。

このように、C言語のコードは何段階も変換されて最終的にコンピューターが理解できる形になります。ざっくり説明しましたが、細かい部分を知りたい場合は特定のステップについて深掘りできますよ!(by Copilot)

変数の型とデータサイズ

int型…4byte(バイト)=32bit(ビット)
1byte=8bit
bitは「0」か「1」を表現する最小単位。

変数の初期化

C言語では、変数を宣言しただけでは、中身のデータは不定。
このため「初期化(代入)」が必要になる。
ちなみに、なぜ「不定」かというと
・ほかのプログラムが使ったデータがそのまま残っている
・システム起動時には、電流の流れ込む状況によってメモリ内のデータはランダム
という理由による。

整数型

型名値の範囲サイズ
int(signed int)言語・OS・コンパイラによる(現Windowsだと大体32bit)
unsigned int言語・OS・コンパイラによる(現Windowsだと大体32bit)
long(signed long)言語・OS・コンパイラによる(現Windowsだと大体32bit)
unsigned long言語・OS・コンパイラによる(現Windowsだと大体32bit)
short(signed short)-32768~3276716bit
unsigned short0~6553516bit
char(signed char)-128~1278bit
unsigned char0~2558bit
long long(signed long long)-2の63乗~2の63乗-164bit
unsigned long long0~2の64乗-164bit

例えば(signed)intは「32ビット符号付き整数」とも呼ばれる場合がある。
情報技術者試験などではこのような呼び方が使われることも多いので覚えておく。

※「符号」について
符号を扱う場合、メモリ上は「先頭ビット(最上位ビット)」を「符号」として取り扱う。
「0」なら+で、「1」がー。このため表現できる数字が小さくなる。
(ーの数が含まれるため表現できる数の総数は変わらない。)

※「補数」について
2の補数は、コンピューターが負の整数を扱うときに使う表現方法です。ざっくり言うと、「符号付き整数」を計算しやすくするための仕組みですね。

なぜ2の補数を使うのか?

コンピューターは0と1だけで計算しますが、普通に「マイナスの数」をそのまま扱うのは難しいです。そこで、「2の補数」を使うことで、加減算を簡単にすることができます。

2の補数の求め方

ある整数を「2の補数」で表すには、以下のステップを使います。

  1. 数値をビットで表現(例: 00001100 は 10進数の 12
  2. ビットをすべて反転(0→1、1→0)→ 11110011
  3. 最後に +1 を加える11110100(これが -12)

特徴

  • 加減算がそのままビット演算でできる(例えば -1 + 1 = 0 は、2の補数でも同じ計算ルールになる)
  • 最上位ビット(MSB)が「1」なら負の数、0なら正の数として扱う

この仕組みにより、コンピューターは負の数を特別な処理なしで計算できるようになっています!😃
(by Copilot)

※char型について
日本語は2byteコードなのでchar型には入らない。
入るのは、1byte文字(半角文字。ただし、「半角カナ」はASCIIコードの空きコードに文字を割り当てて規格としてまとめられたもの(Shift-JIS)なので海外仕様のPCでは使えず、エラーの原因になりやすい。避けるのが吉。)
文字1文字、および1byte範囲内の数値を代入できる。
文字を代入する場合は’’で囲う(文字リテラル)。

マルチバイト文字セット=2バイトコードなども使えるようにする。
・・・Unicodeとマルチバイト文字セットの違い
Visual Studioでの「Unicode」と「マルチバイト文字セット(MBCS)」の違いは、文字のエンコーディングの方式にあります。

1. Unicode

  • 文字を UTF-16 でエンコードする方式(Windowsでは通常UTF-16)。
  • グローバル対応しており、ほぼすべての言語の文字を表現できる。
  • wchar_t 型を使用し、L"文字列" のようにプレフィックスを付けてワイド文字列を扱う。

2. マルチバイト文字セット(MBCS)

  • 日本語の Shift-JIS や中国語の Big5 など、特定のローカル言語向けのエンコーディング方式。
  • 1バイトまたは2バイトで文字を表すため、変長(可変長)の文字セットになる。
  • char 型を使用し、"文字列" のように通常の文字列として扱う。

一般的に、Unicode のほうが互換性が高く、現在のアプリケーション開発では主流ですが、古いシステムや特定の環境では MBCS が使われることもあります。

どちらを使うかは、プロジェクトの要件や対象とする言語に依存します。もしグローバル対応を考えているなら、Unicode の利用を推奨します!(by Copilot)

コメント

タイトルとURLをコピーしました