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
是什么使其表现得如此?
答案 0 :(得分:2)
def make_model():
inp = Input(shape=(10,))
h1 = Dense(16, activation='relu')(inp)
h2 = Dense(4, activation='linear')(h1)
# output layer and last hidden layer must have the same dims
out = Dense(4, activation='softmax')(h2)
model = Model(inp, out)
loss_calculator = SampledSoftmaxLoss(model)
model.compile('adam', loss_calculator.loss)
return model
tf.set_random_seed(42)
model = make_model()
model.summary()
需要一个%x
作为参数;如果您想打印一个字节,例如作为unsigned int
,您需要编写uint8_t
。
答案 1 :(得分:2)
第一个代码片段应产生58
,但是您不输出换行符,因此任何后续输出都将在58
之后出现。您可能在片段后面的代码中输出86
。发布显示出令人反感行为的完整程序,或将格式更改为%x\n
,以将58
与后续输出分开。
从技术上讲,printf
期望为unsigned int
转换格式使用%x
参数,但是int
值应该可以正常工作,并且test_payload[0]
会提升为{{ 1}},并原样传递给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
,这本来就够糟糕的……似乎{{1} }以不符合标准的方式错误地传递了unsigned int
值。
另一个潜在的问题根源是,如果您忘记包含printf()
并在没有定义原型的情况下调用uint8_t
。如果C函数( 6.5.2.2函数调用)(在库中)被定义(带有包含省略号的原型),则将该调用明确定义为具有未定义的行为。 <stdio.h>
。