Subsections

7章 H12.12.5: 基本型:文字, 2進数表示, 16進数表示

7.1 本日の課題

以下は, 自分が用いるプロセッサ, コンパイラー, 設定に依存するので, 自分が調べた結果を答えること. △は自由課題としますが, 期末試験では出題範囲に含まれます.

  1. 2進数,8進数,10進数,16進数を理解すること. 10進数で与えられた整数を, 2進数, 8進数, 16進数で表示するプログラムを作成せよ.

  2. 現在各自が用いている環境において小文字(a,b,c, ..., z), 大文字(A,B,C, ..., Z), 数字(0,1,2,3, 4, 5, 6, 7, 8, 9), 記号(!,",',#など) の文字が内部でどのように表現されているか(すなわち文字コード)を調べよ. 文字コードは16進数, 2進数の2種類で表現すること.

  3. △ ビット単位の演算について理解する. (Table 7-2) 演算をする前と後の値を2進数で表示し,確認するプログラムを作成し, 自分で調べた値と演算について答えよ. 特に,^, ~ は不慣れだと思われるので,この機会に習熟しておくこと.

  4. △ 同様にシフト演算子により演算した結果を出力するプログラムを作成せよ. (Table 7-3) 自分で調べた値と演算について答えよ.

講義終了時に, 上で作成したプログラムと実行した結果を全てをメールで送ること. 本文に, 氏名, 学籍番号を明記すること.

7.2 文字

文字は char で宣言し, 英数字1文字分を表現できる.

宣言 printfの書式 scanfの書式
文字 char c; printf("c = %c", c); scanf("%c", &c);
整数 int n; printf("n = %d", n); scanf("%d", &n);
実数 double x; printf("x = %f", x); scanf("%lf", &x);

文字定数(文字リテラル)は, シングルクォーテションで囲んで 'a' のように表わす.

文字列(文字列リテラル)は, ダブるクォーテーションで囲んで "abcdefg" のように表す. 文字列は, これまでにprintf関数への第1引数などで用いている.

「文字」は1文字のみを意味し, 「文字列」は0個も含め複数の文字の並びを意味する.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	char c = 'A';
	
	printf("c = [%c], c = %d\n", c, c);
	return EXIT_SUCCESS;
}

上の例のうち char c = 'A'; の部分を, char c = 'B'; などように置き換えて文字リテラルの扱い方を 練習しておくこと. 特殊な文字も同様に次のように表すことができる. 詳細は 教科書 p. 203 Table 8-2 拡張表記を参照のこと.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	printf("[%c]\n", '\a');
	printf("[%c]\n", '\b');
	printf("[%c]\n", '\t');
	printf("[%c]\n", '\n');
	printf("[%c]\n", '\'');
	printf("[%c]\n", '\"');
	printf("[%c]\n", '\?');
	printf("[%c]\n", '\\');
	printf("[%c]\n", '\123'); // 8進数
	printf("[%c]\n", '\x2a'); // 16進数
	

	return EXIT_SUCCESS;
}

文字列に対しても, 例えば printf("abc\tdef\nghi\n"); を実行すると, abc と def の間にタブ(\t)が出力され, def と ghi の間や ghi の後ろに改行(\n)が出力される. このような 文字列中で用いられる拡張表記は, 文字に対して用いる拡張表記(Table 8-2)と同一である.

内部では, char 型は2ビットの並び(数)として表されていて, 何番がどの文字を表すかを, 予め定められたテーブルに従って変換する. 教科書 p. 200参照のこと.

文字コードを出力するプログラム. コメントにしてある部分のように 文字コードにより文字を初期化することもできる.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	char c   = 'A';
	char c8  = 0123; // 8進数で表した文字.
	char c16 = 0x2a; // 16進数で表した文字.
	
	// c を出力
	printf("cを文字として出力      : [%c]\n", c);
	printf("cのコードを10進数で出力: [%d]\n", c);
	printf("cのコードを16進数で出力: [%x]\n", c);
	
	return EXIT_SUCCESS;
}

7.3 wchar ワイドキャラクター

英数字は 7ビットで全てを区別でき, char 型変数は切りがいい1バイト(=8ビット)で表現される. 漢字などは 1バイトでは全てを区別できず, 2バイト以上で表現され, このために wchar 型を用いる. wchar 型は, 漢字などの1バイトで表現できない文字を扱うための型で, 1995年にISO規格 (C95) に追加された. 詳細は, 「[20.10] ワイド文字とマルチバイト文字」参照のこと.

7.4 ビット演算

ビット演算の用途については, 「ビット演算 」[20.4.1] にまとめてあるので参照のこと.

(c)1999-2013 Tetsuya Makimura