C言語の符号付き整数と符号なし整数を完全ガイド!初心者でもわかるsignedとunsignedの違い
生徒
「C言語で数字を保存する変数って色々ありますよね?intとかlongとか。signedとunsignedの違いがよく分からないです。」
先生
「C言語の整数型には、符号付きと符号なしという二つの考え方があります。同じ数字を保存する変数でも、扱える範囲が違うんです。」
生徒
「符号付きと符号なし…。プラスとマイナスのことですか?」
先生
「その通りです。符号付きはマイナスも使える整数、符号なしはゼロ以上の整数を扱います。それぞれにメリットがあるので、仕組みを知るとプログラムがもっと書きやすくなりますよ。」
1. 符号付き整数とは?
C言語の整数型で最もよく使われるのが符号付き整数です。符号付きとは、プラスとマイナスの両方を扱えるという意味で、signed intやintがこれにあたります。日常生活で使う数字と同じように扱えるため、初心者がプログラムを書くときによく利用されます。
例えば、ゲームで体力が減ってマイナスになる処理や、温度のようにプラスとマイナスを扱う場合など、符号付き整数は多くの場面で活躍します。
#include <stdio.h>
int main(void){
int a = -10;
int b = 20;
printf("%d\n", a + b);
return 0;
}
符号付き整数は、マイナスの値も表現するために、内部で一ビットを符号に使います。つまり、保存できる範囲は少し減りますが、幅広い状況で使える柔軟なデータ型になります。
2. 符号なし整数とは?
符号なし整数は、ゼロ以上の値しか扱わない代わりに、大きな整数を保存できます。unsigned intという書き方をし、符号にビットを使わないため、全てのビットを数値として利用できます。
たとえば、ゲームでスコアや残り弾数のようにマイナスになることがない数値、または画像処理やデータサイズなど、必ずゼロ以上になるデータに最適です。
#include <stdio.h>
int main(void){
unsigned int score = 4000;
printf("%u\n", score);
return 0;
}
符号なしはマイナスが存在しないため、同じサイズの整数型でもより大きい値まで保存できます。プラスだけを扱う場面では速度も安定し、Overflowエラーのチェックもしやすくなります。
3. 保存できる数値の範囲の違い
符号付きと符号なしの大きな違いは、保存できる値の範囲です。コンピュータの世界では、整数は二進数で記録されます。一ビットは〇か一で表現され、ビット数が増えると表現できる値も増えます。
符号付きはマイナスを扱うために一ビットを符号情報に使いますが、符号なしはゼロから始まる大きな範囲をそのまま使えます。同じビット数でも扱える範囲が変わるため、適切に選ぶとメモリを無駄にせず効率的なプログラムになります。
例えば三十二ビットの整数の場合、符号付きはマイナス二十億からプラス二十億ほど、符号なしはゼロから四十億ほどまで扱えます。プログラミング初心者でも、数字の範囲が重要になる場面が必ず出てくるので、覚えておくと役に立ちます。
4. マイナスを使わないならunsignedが便利
符号なしの整数は、値がゼロ以上になる状況で特に有利です。巨大なファイルサイズを扱う処理や、センサーの計測値など、マイナスにならない情報はunsignedで扱うと安全です。
さらに、符号なしの値はマイナスが使えないため、予期せぬエラーを防ぎやすくなります。例えば、ゼロからカウントダウンする処理でマイナスになった場合、意図しない大きな数値に変わってしまうことがあります。このようなミスを防ぐ意味でも、用途に合わせて型を選ぶことが重要です。
5. signedとunsignedを混ぜると注意が必要
符号付きと符号なしの整数を同じ計算式で扱うと、結果が思っていたものと違うことがあります。これは、内部で自動的に型変換が起きるためです。符号ありと符号なしが混ざると、符号なしが優先され、マイナスの値が非常に大きな値として扱われることがあります。
#include <stdio.h>
int main(void){
int a = -1;
unsigned int b = 5;
printf("%u\n", a + b);
return 0;
}
429496729...
このように、符号付きがマイナスでも、符号なしと計算すると桁の大きい数値になることがあります。初心者がエラーで悩む場面のひとつなので、型をそろえるか、意図的にキャストして対応することが重要です。
6. signedとunsignedの使いどころを理解しよう
プログラミング初心者のころは、intだけで済ませることが多いですが、より大きなデータを扱う場面やメモリ管理を意識した開発になると、符号なしの整数が重要になります。
ゼロ以上の値しか出ない場合、符号なしを使うと扱える範囲が広がり、メモリや計算処理が効率的になります。逆に、マイナスが出る可能性がある処理では、必ず符号付き整数にしなければなりません。
C言語は細かく制御できる言語なので、型の違いを知ることで安全で無駄のないプログラムを書くことができます。符号付きと符号なしを理解することは、C言語の基礎をしっかり固めるためにとても重要です。