コンテンツにスキップ

C言語/signed

出典: フリー教科書『ウィキブックス(Wikibooks)』

概要

[編集]

signed は、C 言語において整数型の符号を明示的に指定する修飾子です。デフォルトで符号付き (signed) である int 型に対して、明示的に signed を付与することで符号付き整数であることを明確にすることができます。

C 言語では signedint の別名として扱われ、signed int は単に int と同義です。ただし、char 型の符号は処理系に依存するため、signed charunsigned char の違いは重要です。

signed 型の仕様とデフォルトの動作

[編集]

C 言語では、以下のように signedint 型の別名として機能します。

型の宣言 意味
int signed int と同義 (符号付き整数)
signed int 明示的に符号付き整数を指定
signed signed int と同義

例えば、次の 3 つの宣言はすべて同じ意味を持ちます。

int a = -10;
signed int b = -10;
signed c = -10;

これは、int 型がデフォルトで signed であるため、signed を明示しなくても符号付き整数として扱われるためです。

signed の適用対象

[編集]

signedint のみならず、他の整数型にも適用可能です。特に 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 を明示する利点と注意点

[編集]

利点

[編集]
  1. コードの可読性向上
    • signed charunsigned char を明示することで、意図を明確にできる。
    • signed を付与することで、符号の有無を明示的に示し、誤解を防ぐ。
  2. char の符号を確実に制御
    • 環境によって charsigned または unsigned になるため、符号を明示することで意図しない動作を防ぐ。
  3. 符号なし型 (unsigned) との一貫性
    • signed を明示することで、unsigned との対比が明確になり、型の取り扱いを統一できる。

注意点

[編集]
  • signedint に対しては冗長なので、通常 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;
}

まとめ

[編集]
  • signedint の別名として機能し、signed intint は同義。
  • signedchar 型に対して明示的に指定することで符号の違いを制御できる。
  • signed は通常 int には不要だが、signed char などのケースでは有効。
  • 変数の符号を明示することで、意図しない型の扱いによるバグを防げる。

このように、signedint の別名として機能しながらも、char の符号を制御する際に特に有用です。符号付き・符号なしの型の使い分けを適切に行うことで、より安全で可読性の高いコードを記述することができます。