簡體   English   中英

為什么此uint32_t的值為-2147483648?

[英]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()不知道您傳遞的內容的類型,必須信任您使用正確的轉換說明符 但是你沒有。 使用%dprintf()會將您的值解釋為int

unsigned intuint32_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.

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