为什么这个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,它适用于 unsigned 整数。 printf 不够 聪明 来猜测您的数据类型。

Source

printf() 不知道您传递给它的东西的类型,因此必须 信任 您使用正确的 转换说明符 .但你没有。对于 %dprintf() 将您的值解释为 int

unsigned intuint32_t 相同(很常见)的平台上,您可以使用 %u 代替。但请注意,这不是便携式的,例如到 int 只有 16 位的平台。打印 uint32_t 的正确方法如下所示(您必须包含 inttypes.h):

printf("%" PRIu32 "\n", var);

参见例如this inttypes.h reference

您在这里使用了错误的格式说明符。 %d 用于 int 类型,即有符号整数类型。

要打印精确的宽度变量,您需要使用 PRIuN 宏作为格式说明符。

对于无符号类型的 32 位,那将是 PRIu32。有关详尽列表,请参阅章节 §7.8.1,C11.

var 的类型是 uint32_t。但是您正在使用 %d 打印它,这是 未定义的行为 。使用 <inttypes.h> 中的 PRIu32 打印 uint32_t:

printf("%"PRIu32"\n",var);