C 言語での Unsigned Int と SignedInt の違い

Muhammad Zeeshan 2023年10月12日
  1. C 言語の signedunsigned Int の違い
  2. 必要なメモリ容量
  3. まとめ
C 言語での Unsigned Int と SignedInt の違い

次の記事では、C プログラミング言語での符号付きと符号なしの int の違いについて説明します。

C 言語の signedunsigned Int の違い

signed intunsigned 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 の場合、signbits の 1つを使用する必要はありません。

これは、ネガティブなエンコーディングを犠牲にして、さまざまなポジティブなエンコーディングを受け取ることを意味します。

必要なメモリ容量

まず、signed intunsigned int がコンピュータのシステムで占めるメモリ容量を確認します。

  1. int のメモリ要件は 4 バイトであり、8 を掛けると 32 ビットになります。

    4x8 = 32 bits
    
  2. さらに、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 から 4294967295 (この値を含む) に相当します。

unsigned int データ型の変数は、コンピューターが通常、データをバイナリ形式で格納する場所です。

例を見てみましょう。まず、変数 xunsigned 型の初期値を指定します。

次に、負の数を unsigned int 変数 x に保存しようとすると、コンピューターは 123 の二の補数を使用して負の数として表現しました。次に、その表現を x 変数のメモリに格納しました。

unsigned int x;
x = -123;

したがって、負の -123int データ型の変数 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 データ型を使用すると役立ちます。

Muhammad Zeeshan avatar Muhammad Zeeshan avatar

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

関連記事 - C Integer