printf在某些情况下给了我奇怪的额外值。会发生什么事?
我正在操作uint8数组中的值,并将其打印到我的终端以验证一切是否正确。但是由于某些原因,当我打印一个uint8_t时,我得到了奇怪的值-我得到了期望值加上一些其他值(它总是相同的额外值),就好像我打印了一个uint16_t或其他16位值一样。我将其全部简化为以下示例:
这是测试代码

test_payload[0] = (uint8_t)0x58;
test_payload[1] = (uint8_t)0x7B;
test_payload[2] = (uint8_t)0x6B;
test_payload[3] = (uint8_t)0x05;
test_payload[4] = (uint8_t)0x4F;
test_payload[5] = (uint8_t)0x81;
test_payload[6] = (uint8_t)0x69;
test_payload[7] = (uint8_t)0x00;

printf("%x\n\r", test_payload[0]);
printf("%x\n\r", test_payload[1]);
printf("%x\n\r", test_payload[0] + test_payload[1]);

for(i = 0; i < 8; i++)
{
    printf("%x", test_payload[i]);
}

我得到的结果是
5803
7b03
d3
58037b0333034f03810369033

是什么让它这样?

最佳答案

第一个代码片段应该产生58,但您不输出换行符,因此任何后续输出都将出现在58之后。有可能在片段后面的代码中输出86。发布一个显示违规行为的完整程序,或将格式更改为%x\n以将58与后续输出分离。
技术上,printf期望unsigned int参数用于%x转换格式,但是int值应该可以正常工作,并且test_payload[0]被提升为int并作为printf传递。您可以尝试将格式更改为%hhx或将参数强制转换为(unsigned int)test_payload[0],但仅这些更改中的一个就解决了问题,这将是非常令人惊讶的。
编辑:从你的额外信息来看,你的嵌入式目标的编译器看起来很特别。一定要试着把论点像

printf("%x\r\n", (unsigned int)test_payload[0]);

观察到printf("%x\n\r", test_payload[0] + test_payload[1]);似乎工作得很好,问题是没有通过int而不是unsigned int,这已经够糟了。。。似乎printf()以不一致的方式错误地传递uint8_t值。
另一个潜在的问题源是,如果忘记包含<stdio.h>并且调用printf时没有使用原型的定义。C标准(6.5.2.2函数调用)明确定义,如果函数是用包含省略号(...)的原型(在库中)定义的,则此调用具有未定义的行为。

关于c - 使用COSMIC编译器的stm8l上printf的奇怪行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56923714/

10-12 14:51
查看更多