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