2012-07-17 320 views
3

我認爲結果會是(2**32 - 1)爲什麼在C中將0xffffffff轉換爲十進制是-1?

#include <stdio.h> 
int main(){ 
    unsigned int a = 0xffffffff; 
    printf("the size of int a %d\n",a); 
    return 0; 
} 

,但它給了我-1,任何想法?

+8

'%D' - >'%u' ... – Mysticial 2012-07-17 01:52:44

+3

不要騙printf()的有關參數類型,你贏了別驚訝。 – 2012-07-17 01:55:22

回答

2

您要求printf()將該值解釋爲有符號整數,其範圍爲-(2**31)(2**31)-1。基本上,高位是一個符號位。閱讀關於two's complement

+1

如果高位*是一個符號位,那麼0x8000應該是-0 ..我認爲這更清楚(從長遠來看,更容易混淆)以避免這個詞。 – 2012-07-17 02:34:18

+2

當且僅當數字是負數時才設置高位,所以我認爲把它稱爲符號位是公平的。 * other *位的含義對於負數有點微妙,但這就是爲什麼我鏈接到具有細節的頁面。 – Wyzard 2012-07-17 02:37:53

7

您正在使用錯誤的格式字符串。 %d是帶符號的十進制整數。你應該使用%u

printf不知道您傳遞變量的類型。這取決於你選擇正確的格式字符串。

0

因爲%d代表一個有符號的整數。使用有符號整數時,高位(第32位)在整數爲負數時設置,或者視情況而定。在0xFFFFFFFF中設置高位,所以在轉換爲有符號整數時,結果爲負。爲了治療高位爲數字本身的一部分,使用無符號類型

%lu or %u 
相關問題