为什么这个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
不够 聪明 来猜测您的数据类型。
printf()
不知道您传递给它的东西的类型,因此必须 信任 您使用正确的 转换说明符 .但你没有。对于 %d
,printf()
将您的值解释为 int
。
在 unsigned int
与 uint32_t
相同(很常见)的平台上,您可以使用 %u
代替。但请注意,这不是便携式的,例如到 int
只有 16 位的平台。打印 uint32_t
的正确方法如下所示(您必须包含 inttypes.h
):
printf("%" PRIu32 "\n", var);
您在这里使用了错误的格式说明符。 %d
用于 int
类型,即有符号整数类型。
要打印精确的宽度变量,您需要使用 PRIuN
宏作为格式说明符。
对于无符号类型的 32 位,那将是 PRIu32
。有关详尽列表,请参阅章节 §7.8.1,C11
.
var
的类型是 uint32_t
。但是您正在使用 %d
打印它,这是 未定义的行为 。使用 <inttypes.h>
中的 PRIu32
打印 uint32_t
:
printf("%"PRIu32"\n",var);
使用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
不够 聪明 来猜测您的数据类型。
printf()
不知道您传递给它的东西的类型,因此必须 信任 您使用正确的 转换说明符 .但你没有。对于 %d
,printf()
将您的值解释为 int
。
在 unsigned int
与 uint32_t
相同(很常见)的平台上,您可以使用 %u
代替。但请注意,这不是便携式的,例如到 int
只有 16 位的平台。打印 uint32_t
的正确方法如下所示(您必须包含 inttypes.h
):
printf("%" PRIu32 "\n", var);
您在这里使用了错误的格式说明符。 %d
用于 int
类型,即有符号整数类型。
要打印精确的宽度变量,您需要使用 PRIuN
宏作为格式说明符。
对于无符号类型的 32 位,那将是 PRIu32
。有关详尽列表,请参阅章节 §7.8.1,C11
.
var
的类型是 uint32_t
。但是您正在使用 %d
打印它,这是 未定义的行为 。使用 <inttypes.h>
中的 PRIu32
打印 uint32_t
:
printf("%"PRIu32"\n",var);