1

printf 在某些情况下给了我奇怪的额外值。可能会发生什么?

我正在处理 uint8_t 数组中的值并将其打印到我的终端以验证一切是否正确。但是由于某种原因,当我打印一个 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

是什么让它表现得那样?

4

2 回答 2

2

%x需要一个unsigned intas 参数;如果要打印单个字节,例如 as uint8_t,则需要编写%hhx.

于 2019-07-07T15:56:49.247 回答
2

第一个代码片段应该生成58,但您不输出换行符,因此任何后续输出都将出现在58. 您可以在片段后面的代码中输出86。发布表现出违规行为的完整程序,或更改格式%x\n以与后续输出分开58

从技术上讲,printf需要一个转换格式的unsigned int参数,但一个值应该可以正常工作,并被提升并传递给. 您可以尝试将格式更改为或将参数强制转换为,但仅凭这些更改之一就可以解决问题,这将是非常令人惊讶的。%xinttest_payload[0]intprintf%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]);似乎工作正常,问题不在于传递 anint而不是传递 an unsigned int,这已经够糟糕了......似乎以不符合的方式错误地printf()传递了值。uint8_t

另一个潜在的问题来源是如果您忘记包含<stdio.h>并在printf没有定义原型的情况下调用。C 标准(6.5.2.2 函数调用)明确将此调用定义为具有未定义的行为,如果该函数是使用包含省略号 () 的原型定义...的(在库中)。

于 2019-07-07T16:32:43.613 回答