C 語言中無符號整數和有符號整數的區別

Muhammad Zeeshan 2023年10月12日
  1. C 語言中 signedunsigined Int 之間的區別
  2. 記憶體要求
  3. まとめ
C 語言中無符號整數和有符號整數的區別

下面的文章將探討 C 程式語言中帶符號和無符號 int 之間的區別。

C 語言中 signedunsigined Int 之間的區別

signed intunsigned int 之間的區別並不像某些人想象的那麼複雜。signed int 通常表示為 int,但在處理 unsigned int 時,我們必須寫為 unsigned int

int 是一種資料型別而 unsigned 只是一個關鍵字這一事實具有與硬體級別相關的特定功能。這種獨特的目的在兩者之間產生了更顯著的差異,將在以下部分中進一步詳細介紹。

  • int 資料型別是 signed 並且必須具有至少 -3276732767 的範圍作為其最小範圍要求。limits.h 指的是實際值作為 INT MININT MAX 的對應值。
  • unsigned int 具有從 065535(含)的最小範圍,實際最大值由標頭檔案的 UINT_MAX 常量定義。如果值為無符號,則不需要將之一用於符號

這意味著你會收到更多種類的正面編碼,而不會犧牲任何負面編碼。

記憶體要求

首先,檢查 signed intunsigned int 在計算機系統中佔用了多少記憶體空間。

  1. int 的記憶體要求是 4 bytes,乘以 832 bits

    4x8 = 32 bits
    
  2. 此外,unsigned int 還佔用了 4 位元組 的記憶體空間,加起來為 32 位

    • int 資料型別中,32-bits 中最左邊的 bit 指定為 sign bit,指示整數是正數還是負數。1 表示負值,而 0 表示正值。
    • 當前可以儲存在 int 變數中的整數範圍是 -(2^31)2^31-1,等於 -2 147 483 6482 147 483 647)。

當一個負數輸入計算機時,它會以二進位制形式表示為該數字的 2 補碼。正因為如此,記憶體的開始總是被設定為 1,而計算機只要看到初始被設定為 1,就會知道它遇到了一個負數。

每當我們訪問該數字時,它都會通過對其應用 2 的補碼來恢復其原始形式。然而,對於 unsigned int 資料型別,沒有像 sign bit 這樣的 bit

因此,它現在擁有所有 32 位可供我們用來儲存資料。unsigned int 中可以儲存的整數範圍是從 02^32-1,相當於 04294967295,包括的。

unsigned int 資料型別的變數是計算機通常以二進位制格式儲存資料的地方。

讓我們舉個例子。首先,我們將給變數 x 一個無符號型別的初始值。

然後,當我們試圖將負數儲存在 unsigned int 變數 x 中時,計算機使用 123 的二補數將其表示為負數。然後將該表示儲存在 x 變數的記憶體中。

unsigned int x;
x = -123;

因此,當我們將負數 -123 儲存在 int 資料型別的變數 y 中時,計算機將 -123 的二補數錶示為負整數,然後將其儲存在 y 變數的記憶。

int y;
y = -123;

Unsigned int 變數僅以標準二進位制形式儲存正值;當我們試圖通過 x 變數的記憶體訪問它的記憶體時,沒有保留符號位。結果,計算機不需要轉換,之前儲存的二補數被恢復並顯示為常規二進位制數。

printf("%d\n", x);

當我們試圖訪問變數 y 的記憶體時,計算機確定它是 int 資料型別。然後它檢查了 32-bit 最左邊位置的 bit,發現它是 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