C言語におけるsignedキーワードの詳細解説

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言語では、charshortintlong は明示的に 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)には無効(これらは常に符号付き)。
  • signedunsigned を同一宣言で併用するとコンパイルエラーになる。
  • 他の修飾子(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(未定義動作の典型例)

タグ: C言語 signed 整数型 2の補数 オーバーフロー

5月17日 12:05 投稿