Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
unsigned / signed / const / volatile
型修飾子は基本型に付加して、変数の性質を変えるキーワードです。符号の有無を指定する『unsigned/signed』、値の変更を禁止する『const』、最適化を制御する『volatile』があります。
構文
// 符号なし整数型(0以上の値のみ)を宣言します。 unsigned int 変数名; unsigned char 変数名; // 符号あり整数型(負の値も扱える)を宣言します(デフォルト)。 signed int 変数名; // 値を変更できない定数を宣言します。 const 型 変数名 = 値; // コンパイラの最適化を抑制します。 volatile 型 変数名; // 複数の修飾子を組み合わせることもできます。 const unsigned int 変数名 = 値;
型修飾子一覧
| 修飾子 | 概要 |
|---|---|
| unsigned | 符号なし整数型にします。負の値を扱わない代わりに、正の値の上限が約2倍になります。例えば『unsigned int』は0〜4294967295を扱えます。 |
| signed | 符号あり整数型にします。デフォルトの挙動のため通常は省略しますが、『char』は処理系によって符号ありかなしかが異なるため明示することがあります。 |
| const | 変数を定数として宣言します。宣言時に初期化が必須で、以降は代入や変更ができません。 |
| volatile | コンパイラの最適化を抑制します。割り込みやハードウェアレジスタのように、プログラムの外部から値が変わる可能性がある変数に使用します。 |
サンプルコード
#include <stdio.h>
int main(void) {
// unsigned int はゼロ以上の整数を扱います。
unsigned int population = 1280000000u; // u サフィックスで符号なし定数を表します。
printf("人口: %u\n", population); // 『人口: 1280000000』と出力されます。
// unsigned char はバイトデータの処理に便利です。
unsigned char byte = 255;
printf("バイト値: %u\n", byte); // 『バイト値: 255』と出力されます。
// オーバーフローの挙動の違いを確認します。
unsigned int u = 0;
u = u - 1; // 符号なしは 0 - 1 が最大値になります(ラップアラウンド)。
printf("unsigned のラップアラウンド: %u\n", u); // 『4294967295』と出力されます。
// const で定数を宣言します。
const double PI = 3.14159265358979;
const int MAX_SIZE = 100;
printf("円周率: %f\n", PI);
printf("最大サイズ: %d\n", MAX_SIZE);
// PI = 3.0; // コンパイルエラーになります。
// volatile はハードウェアレジスタや割り込み変数に使います。
volatile int sensor_value = 0;
// コンパイラはこの変数への毎回のアクセスを最適化しません。
printf("センサー値: %d\n", sensor_value);
// const と volatile の組み合わせ(読み取り専用ハードウェアレジスタなど)。
// const volatile int *reg = (int *)0x40000000;
return 0;
}
概要
『unsigned』型は負の値を扱わないことで正の値の範囲を広げます。符号なし型と符号あり型を混在させた演算は意図しない結果を招くことがあります。比較演算でも符号なし型が優先されるため、注意が必要です。
『const』はコンパイラに「この値を変更しない」ことを伝えることで、不正な代入をコンパイル時に検出できます。マクロ(『#define』)による定数定義より型チェックが効くため、C99以降では『const』を使う方が推奨されます。マクロについては『#include / #define(定数)』を参照してください。
『volatile』はハードウェア制御や組み込みプログラミングで重要です。コンパイラはレジスタキャッシュなどの最適化を行うことがありますが、外部から値が変わる変数に対してはこの最適化が誤動作を引き起こします。各型の実際のサイズは『sizeof』で確認できます。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。