C言語では、整数型を符号付き(positive/negative/zeroを表現可能)または符号なし(non-negativeのみ)として扱うことができます。この区別には signed および unsigned キーワードが使用されます。
signed の役割
signed は整数型を明示的に符号付きとして宣言する修飾子です。C言語で利用可能な符号付き整数型は以下の4種類です:
signed char:1バイト(-128〜127)signed short:2バイト(-32,768〜32,767)signed int:通常4バイト(-2,147,483,648〜2,147,483,647)signed long:通常8バイト(-9,223,372,036,854,775,808〜9,223,372,036,854,775,807)
これらの型は内部で2の補数表現を採用しており、最上位ビットが符号ビット(0: 正、1: 負)として機能します。例えば、32ビット整数における 42 と -42 は次のように表現されます:
42 → 00000000 00000000 00000000 00101010
-42 → 11111111 11111111 11111111 11010110
デフォルトの符号付き性
C言語では、char、short、int、long は明示的に unsigned を指定しない限り、すべて符号付きとして扱われます。つまり、int x; は signed int x; と等価です。signed を明記するのは冗長ですが、コードの意図を明確にするために有用な場合があります。
signed char sc = -64;
signed short ss = 10000;
signed int si = -2000000000;
signed long sl = 123456789012345LL;
使用上の注意点
signedは整数型にのみ適用可能。浮動小数点型(float,double)には無効(これらは常に符号付き)。signedとunsignedを同一宣言で併用するとコンパイルエラーになる。- 他の修飾子(
const,volatile,staticなど)とは組み合わせ可能だが、文法的には正しい位置に配置する必要がある:const signed int value = 100; - 単一の宣言文で複数の変数を定義する際、修飾子はその宣言内のすべての識別子に適用される:
混在させたい場合は別々の宣言が必要。signed int a, b; // a, b ともに signed unsigned int c, d; // c, d ともに unsigned - 符号付き整数の演算結果が範囲外になるとオーバーフローが発生し、未定義動作(多くの実装ではラップアラウンド)を引き起こす可能性がある:
signed int max = 2147483647; signed int result = max + 1; // 結果は -2147483648(未定義動作の典型例)