我認爲結果會是(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
,任何想法?
我認爲結果會是(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
,任何想法?
您要求printf()
將該值解釋爲有符號整數,其範圍爲-(2**31)
至(2**31)-1
。基本上,高位是一個符號位。閱讀關於two's complement。
如果高位*是一個符號位,那麼0x8000應該是-0 ..我認爲這更清楚(從長遠來看,更容易混淆)以避免這個詞。 – 2012-07-17 02:34:18
當且僅當數字是負數時才設置高位,所以我認爲把它稱爲符號位是公平的。 * other *位的含義對於負數有點微妙,但這就是爲什麼我鏈接到具有細節的頁面。 – Wyzard 2012-07-17 02:37:53
您正在使用錯誤的格式字符串。 %d
是帶符號的十進制整數。你應該使用%u
。
printf
不知道您傳遞變量的類型。這取決於你選擇正確的格式字符串。
因爲%d代表一個有符號的整數。使用有符號整數時,高位(第32位)在整數爲負數時設置,或者視情況而定。在0xFFFFFFFF中設置高位,所以在轉換爲有符號整數時,結果爲負。爲了治療高位爲數字本身的一部分,使用無符號類型
%lu or %u
'%D' - >'%u' ... – Mysticial 2012-07-17 01:52:44
不要騙printf()的有關參數類型,你贏了別驚訝。 – 2012-07-17 01:55:22