簡體   English   中英

C中的unsigned int和signed int有什么區別?

[英]What is a difference between unsigned int and signed int in C?

考慮這些定義:

int x=5;
int y=-5;
unsigned int z=5;

它們是如何存儲在內存中的? 任何人都可以解釋這些在內存中的位表示嗎?

int x=5int y=-5可以在內存中具有相同的位表示嗎?

ISO C 說明了不同之處。

int數據類型是有符號的,其最小范圍至少為 -32767 到 32767(含)。 實際值在limits.h分別給出為INT_MININT_MAX

unsigned int的最小范圍為 0 到 65535,實際最大值為來自同一頭文件的UINT_MAX

除此之外,該標准不強制要求使用二進制補碼符號對值進行編碼,這只是其中一種可能性。 三種允許的類型將具有以下 5 和 -5 的編碼(使用 16 位數據類型):

        two's complement  |  ones' complement   |   sign/magnitude
    +---------------------+---------------------+---------------------+
 5  | 0000 0000 0000 0101 | 0000 0000 0000 0101 | 0000 0000 0000 0101 |
-5  | 1111 1111 1111 1011 | 1111 1111 1111 1010 | 1000 0000 0000 0101 |
    +---------------------+---------------------+---------------------+
  • 在二進制補碼中,您通過反轉所有位然后加 1 得到一個負數。
  • 在一個的補碼中,您通過反轉所有位得到一個數字的負數。
  • 在符號/幅度中,最高位是符號,因此您只需將其反轉即可獲得負數。

請注意,正值對所有表示具有相同的編碼,只有負值不同。

進一步注意,對於無符號值,您不需要使用其中一位作為符號。 這意味着您在積極方面獲得了更多范圍(當然,以沒有消極編碼為代價)。

不,無論您使用哪種表示, 5-5都不能具有相同的編碼。 否則,就沒有辦法區分。


順便說一句,目前在 C 和 C++ 標准中都在采取行動,將二進制補碼指定為負整數的唯一編碼。

因為這一切都與內存有關,所以最終所有的數值都以二進制形式存儲。

一個 32 位無符號整數可以包含從所有二進制 0 到所有二進制 1 的值。

當涉及到 32 位有符號整數時,這意味着它的一個位(最重要的)是一個標志,它將值標記為正數或負數。

C 標准規定無符號數將以二進制形式存儲。 (帶有可選的填充位)。 帶符號的數字可以以三種格式之一存儲:幅度和符號; 補碼或補碼。 有趣的是,這排除了某些其他表示,如Excess-n 或 Base −2

然而,在大多數機器和編譯器上,以 2 的補碼形式存儲有符號數。

int通常是 16 位或 32 位。 標准說int應該是對底層處理器最有效的任何東西,只要它是>= short<= long那么它是標准所允許的。

然而,在某些機器和操作系統上,歷史導致int不是當前硬件迭代的最佳大小。

這是一個很好的鏈接,它解釋了在 C 中存儲有符號和無符號 INT -

http://answers.yahoo.com/question/index?qid=20090516032239AAzcX1O

取自上述文章-

“使用稱為二進制補碼的過程將正數轉換為負數。這樣做的副作用是最高有效位用於告訴計算機該數字是正數還是負數。如果最高有效位是 1,則數字為負數。如果為 0,則數字為正數。”

假設 int 是一個 16 位整數(這取決於 C 實現,現在大多數是 32 位)位表示不同,如下所示:

 5 = 0000000000000101
-5 = 1111111111111011

如果將二進制 1111111111111011 設置為無符號整數,則將是十進制 65531。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM