[英]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.