C 語言中無符號整數和有符號整數的區別
下面的文章將探討 C 程式語言中帶符號和無符號 int 之間的區別。
C 語言中 signed 和 unsigined Int 之間的區別
signed int 和 unsigned int 之間的區別並不像某些人想象的那麼複雜。signed int 通常表示為 int,但在處理 unsigned int 時,我們必須寫為 unsigned int。
int 是一種資料型別而 unsigned 只是一個關鍵字這一事實具有與硬體級別相關的特定功能。這種獨特的目的在兩者之間產生了更顯著的差異,將在以下部分中進一步詳細介紹。
int資料型別是signed並且必須具有至少-32767到32767的範圍作為其最小範圍要求。limits.h指的是實際值作為INT MIN和INT MAX的對應值。unsigned int具有從0到65535(含)的最小範圍,實際最大值由標頭檔案的UINT_MAX常量定義。如果值為無符號,則不需要將位之一用於符號。
這意味著你會收到更多種類的正面編碼,而不會犧牲任何負面編碼。
記憶體要求
首先,檢查 signed int 和 unsigned int 在計算機系統中佔用了多少記憶體空間。
-
int的記憶體要求是4 bytes,乘以8是32 bits。4x8 = 32 bits -
此外,
unsigned int還佔用了4 位元組的記憶體空間,加起來為32 位。- 在
int資料型別中,32-bits中最左邊的bit指定為sign bit,指示整數是正數還是負數。1表示負值,而0表示正值。 - 當前可以儲存在
int變數中的整數範圍是-(2^31)到2^31-1,等於-2 147 483 648到2 147 483 647)。
- 在
當一個負數輸入計算機時,它會以二進位制形式表示為該數字的 2 補碼。正因為如此,記憶體的開始位總是被設定為 1,而計算機只要看到初始位被設定為 1,就會知道它遇到了一個負數。
每當我們訪問該數字時,它都會通過對其應用 2 的補碼來恢復其原始形式。然而,對於 unsigned int 資料型別,沒有像 sign bit 這樣的 bit。
因此,它現在擁有所有 32 位可供我們用來儲存資料。unsigned int 中可以儲存的整數範圍是從 0 到 2^32-1,相當於 0 到 4、294、967、295,包括的。
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 資料型別會有所幫助。
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