C 言語での Unsigned Int と SignedInt の違い
次の記事では、C プログラミング言語での符号付きと符号なしの int
の違いについて説明します。
C 言語の signed
と unsigned
Int の違い
signed int
と unsigned int
の区別は、一部の人が考えるほど複雑ではありません。signed int
はしばしば int
として表されますが、unsigned ints
を扱うときは、unsigned int
と書く必要があります。
int
がデータ型であり、unsigned
がキーワードにすぎないという事実は、ハードウェアレベルに関連する特定の機能を持っています。この独自の目的により、2つの間にさらに大きな違いが生まれます。これについては、次のパートで詳しく説明します。
int
データ型はsigned
であり、最小範囲要件として少なくとも-32767
から32767
の範囲が必要です。limits.h
は、実際の値をINT MIN
およびINT MAX
に対応する値として参照します。unsigned int
の最小範囲は0
から65535
までで、実際の最大値はヘッダーファイルのUINT_MAX
定数で定義されます。値がunsigned
の場合、sign
にbits
の 1つを使用する必要はありません。
これは、ネガティブ
なエンコーディングを犠牲にして、さまざまなポジティブ
なエンコーディングを受け取ることを意味します。
必要なメモリ容量
まず、signed int
と unsigned int
がコンピュータのシステムで占めるメモリ容量を確認します。
-
int
のメモリ要件は4 バイト
であり、8
を掛けると32 ビット
になります。4x8 = 32 bits
-
さらに、
unsigned int
も最大4 バイト
のメモリスペースを使用し、合計で32 ビット
になります。int
データ型では、32 ビット
の左端のビット
が符号ビット
に指定され、整数が正か負かを示します。1
は負の値を示し、0
は正の値を示します。- 現在、変数
int
に格納できる整数の範囲は-(2^31)
から2^31-1
で、これは-2 147 483 648
から2 147 483 647
に等しい。
負の数がコンピューターに入力された場合、それは 2 進数形式でその数の二の補数として表されます。このため、メモリの最初のビット
は常に 1
に設定され、コンピュータは最初のビット
が 1
に設定されているのを見ると、負の数に遭遇したことを認識します。
その番号にアクセスするたびに、二の補数を適用することで元の形式に戻ります。ただし、unsigned int
データ型では、sign bit
のような bit
はありません。
したがって、データを格納するために使用できる 32 ビット
をすべて持つようになりました。これは、0
から 4
、294
、967
、295
(この値を含む) に相当します。
unsigned int
データ型の変数は、コンピューターが通常、データをバイナリ形式で格納する場所です。
例を見てみましょう。まず、変数 x
に unsigned
型の初期値を指定します。
次に、負の数を unsigned int
変数 x
に保存しようとすると、コンピューターは 123
の二の補数を使用して負の数として表現しました。次に、その表現を x
変数のメモリに格納しました。
unsigned int x;
x = -123;
したがって、負の -123
を int
データ型の変数 y
に保存すると、コンピューターは -123
の二の補数を取り、それを負の整数として表し、それを y
変数のメモリ。
int y;
y = -123;
Unsigned int
変数は、標準のバイナリ形式の正の値のみを保持します。x
変数のメモリを介してそのメモリにアクセスしようとしたときに、sign bit
は予約されていませんでした。その結果、コンピューターは変換を必要とせず、以前に保存されていた二の補数が復元され、通常の 2 進数として表示されました。
printf("%d\n", x);
y
変数のメモリにアクセスしようとすると、コンピュータはそれが int
データ型であると判断しました。次に、32 ビット
の左端の位置にあるビット
をチェックし、それが 1
であることを確認しました。
その結果、二の補数を再度取り、負の符号(-
)を追加して、結果を出力しました。
printf("%d\n", y);
完全なソースコード:
#include <stdio.h>
int main() {
unsigned int x;
x = -123;
int y;
y = -123;
printf("%d\n", x);
printf("%d\n", y);
return 0;
}
出力:
-123
-123
まとめ
これで、符号付き整数
と符号なし整数
の主な違いに精通しました。両方の形式のデータにはいくつかの長所と短所があり、そのバランスは完全にニーズに依存していることにも注意してください。
たとえば、膨大な数を格納したい場合は、unsigned int
を使用する必要があり、負の値が発生することはありません。それ以外の場合は、int
データ型を使用すると役立ちます。
I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.
LinkedIn