簡體   English   中英

為什么在 C 中將 0xffffffff 轉換為十進制是 -1?

[英]Why convert 0xffffffff to decimal is -1 in C?

我以為結果是(2**32 - 1)

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

但它給了我-1 ,知道嗎?

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

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

您要求printf()將該值解釋為帶符號的整數,其范圍是-(2**31)(2**31)-1 基本上,高位是符號位。 閱讀二進制補碼

%d格式說明符用於打印有符號整數,並且由於您傳入0xffffffff ,所以printf正確輸出-1

問題是%d說明符用於有符號整數。 您需要使用%u

printf("%d",0xffffffff); // Will print -1

printf("%u",0xffffffff); // Will print 4294967295

順便說一句,我希望在這里看到編譯器警告——類似於“printf() 需要 int 值但參數具有無符號長整數類型”的內容,因為大多數編譯器檢測到類型不匹配。

因為 %d 代表一個帶符號的整數。 對於有符號整數,當整數為負數時設置高位(第 32 位),或者視情況而定。 在 0xFFFFFFFF 中設置了高位,因此當轉換為有符號整數時,結果為負。 要將高位視為數字本身的一部分,請使用無符號類型

%lu or %u 

暫無
暫無

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

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