C言語/signed
概要
[編集]signed は、C 言語において整数型の符号を明示的に指定する修飾子です。デフォルトで符号付き (signed) である int 型に対して、明示的に signed を付与することで符号付き整数であることを明確にすることができます。
C 言語では signed は int の別名として扱われ、signed int は単に int と同義です。ただし、char 型の符号は処理系に依存するため、signed char と unsigned char の違いは重要です。
signed 型の仕様とデフォルトの動作
[編集]C 言語では、以下のように signed は int 型の別名として機能します。
| 型の宣言 | 意味 |
|---|---|
int
|
signed int と同義 (符号付き整数)
|
signed int
|
明示的に符号付き整数を指定 |
signed
|
signed int と同義
|
例えば、次の 3 つの宣言はすべて同じ意味を持ちます。
int a = -10; signed int b = -10; signed c = -10;
これは、int 型がデフォルトで signed であるため、signed を明示しなくても符号付き整数として扱われるためです。
signed の適用対象
[編集]signed は int のみならず、他の整数型にも適用可能です。特に char 型では、符号付き・符号なしの違いが処理系依存であるため、明示的に指定することが推奨されます。
| 型 | 説明 |
|---|---|
signed char
|
符号付き 8 ビット整数 |
signed short
|
符号付き 16 ビット整数 (多くの環境で) |
signed int
|
符号付き 32 ビット整数 (多くの環境で) |
signed long
|
符号付き 32 ビットまたは 64 ビット整数 |
signed long long
|
符号付き 64 ビット整数 |
例えば、char の符号を明示することで、以下のような違いが生じます。
#include <stdio.h> int main() { char a = 255; // char の符号は処理系依存 signed char b = 255; // 明示的に符号付き unsigned char c = 255; // 符号なし printf("char: %d\n", a); // 環境によっては -1 になる可能性あり printf("signed char: %d\n", b); // -1 になる printf("unsigned char: %u\n", c); // 255 になる return 0; }
このように、char の符号の違いが影響する場面では、signed char を明示することで意図した動作を保証できます。
符号付き整数の範囲
[編集]signed 型の範囲は、環境やコンパイラに依存しますが、一般的な 32 ビットおよび 64 ビット環境では以下のようになります。
| 型 | 典型的な範囲 (32 ビット環境) |
|---|---|
signed char
| |
signed short
| |
signed int
| |
signed long
| |
signed long long
|
64 ビット環境では signed long の範囲が拡張され、通常 signed long long と同じ 64 ビットになります。
signed を明示する利点と注意点
[編集]利点
[編集]- コードの可読性向上
signed charとunsigned charを明示することで、意図を明確にできる。signedを付与することで、符号の有無を明示的に示し、誤解を防ぐ。
charの符号を確実に制御- 符号なし型 (
unsigned) との一貫性
注意点
[編集]signedはintに対しては冗長なので、通常intだけを記述すればよい。char以外の型でsignedを使うケースは少ないが、signed charを使う場面では有用。signedの明示が不要な場合は、省略しても問題ない。
signed の使用例
[編集]1. signed を明示した整数型の宣言
[編集]#include <stdio.h> int main() { signed int a = -100; // int と同じ int b = -100; // 省略形 printf("%d %d\n", a, b); // 出力: -100 -100 return 0; }
2. signed char の符号の影響
[編集]#include <stdio.h> int main() { signed char a = -1; unsigned char b = 255; printf("signed char: %d\n", a); // 出力: -1 printf("unsigned char: %u\n", b); // 出力: 255 return 0; }
3. signed のビット表現を確認
[編集]#include <stdio.h> #include <limits.h> int main() { printf("signed char min: %d\n", SCHAR_MIN); printf("signed char max: %d\n", SCHAR_MAX); printf("signed int min: %d\n", INT_MIN); printf("signed int max: %d\n", INT_MAX); return 0; }
まとめ
[編集]signedはintの別名として機能し、signed intとintは同義。signedはchar型に対して明示的に指定することで符号の違いを制御できる。signedは通常intには不要だが、signed charなどのケースでは有効。- 変数の符号を明示することで、意図しない型の扱いによるバグを防げる。
このように、signed は int の別名として機能しながらも、char の符号を制御する際に特に有用です。符号付き・符号なしの型の使い分けを適切に行うことで、より安全で可読性の高いコードを記述することができます。