[英]Why is the value of this uint32_t -2147483648?
使用gcc編譯器,為什么在設置MSB時此uint32_t
-2147483648? 它沒有簽名-不應該是肯定的嗎?
#include <stdio.h>
#include <stdint.h>
#define BIT_SET(a,b) ((a) |= (1<<(b)))
int main()
{
uint32_t var = 0;
BIT_SET(var, 31);
printf("%d\n", var); //prints -2147483648
return 0;
}
%d
用於帶符號整數。 您想要的是%u
,它用於無符號整數。 printf
不夠聰明 ,無法猜測您的數據類型。
printf()
不知道您傳遞的內容的類型,必須信任您使用正確的轉換說明符 。 但是你沒有。 使用%d
, printf()
會將您的值解釋為int
。
在unsigned int
與uint32_t
(非常常見)相同的平台上,可以改用%u
。 但是請注意,這不是可移植的,例如,在int
只有16位的平台上。 打印uint32_t
的正確方法如下所示(您必須包含inttypes.h
):
printf("%" PRIu32 "\n", var);
請參見例如此inttypes.h
參考
您在此處使用了錯誤的格式說明符。 %d
用於int
類型,即有符號整數類型。
要打印精確的寬度變量,您需要使用PRIuN
宏作為格式說明符。
對於32位無符號類型, PRIu32
。 有關詳細列表,請參見第7.8.1節C11
。
var
類型是uint32_t
。 但是您正在使用%d
打印它,這是未定義的行為 。 使用<inttypes.h>
PRIu32
打印uint32_t
:
printf("%"PRIu32"\n",var);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.