【发布时间】:2021-11-25 21:26:28
【问题描述】:
我需要将有符号值转换为无符号值,在尝试使其工作时,我发现 uint32_t 在我将 MSB 分配给 1 时以某种方式被签名。
在这段代码中,我说明了我的意思。 Test1/2 将证明这不仅是 printf 问题,也是算术问题。
#include <stdio.h>
#include <inttypes.h>
void main() {
int reg1S = 0xfffffff4;
int reg2S = 0xfffffff2;
uint32_t reg1U = 0xfffffff4;
uint32_t reg2U = 0xfffffff2;
uint8_t test1,test2;
test1 = (reg1S < reg2S ? 1:0);
test2 = (reg1U < reg2U ? 1:0);
printf("signed = %d \t",test1);
printf("unsigned = %d \n", test2);
printf("reg1S= %d \t", reg1S);
printf("reg1U= %d \n", reg1U);
printf("reg2S= %d \t", reg2S);
printf("reg2U= %d \n", reg2U);
}
这是代码输出的内容
signed = 0 unsigned = 0
reg1S= -12 reg1U= -12
reg2S= -14 reg2U= -14
注意:它不会对 8 位或 16 位无符号整数执行此操作,只有 32 位和 64 位
【问题讨论】:
-
您为
uint32_t使用了错误的格式说明符。见stackoverflow.com/questions/3168275/… -
printf()不知道也不关心传递给它的数据(或者即使没有传递)。如果你告诉它%d,那么无论传递什么,它都会查看它期望数据的位置并将其解释为int类型。如果传递了浮点变量,则与普通函数不同,没有类型转换(除了类型提升),printf()再次查看 32 位数据并假定它是int数据。
标签: c unsigned-integer