我有这个奇怪的问题,我使用的是sprintf,它将FF放在我拥有的值之前。
(例如)我应该得到01,但我得到FF01
我的代码看起来像这样
while(1)
{
if(getkey()=='g')
{
sprintf(str_2, "%X", ~OWReadByte());
lcd_delay();
lcd_string(str_2);
}
}
我对LED做了一些检查,在那里我得到了我想要的价值,在使用sprintf后它就搞砸了。
答案 0 :(得分:2)
一元~
运算符更改整个int
的位,而不仅是低8位。对于16位~0xfeu
,~0x00feu
(相当于0xff01u
)为int
。
我建议在进行位操作时始终使用无符号类型,严格来说,将int
传递给%X
是未定义的行为。
要摆脱较高位,你可以
sprintf(&str_2[i * 2], "%02X", ~OWReadByte() & 0xffu);
答案 1 :(得分:1)
假设至少C99最简单直接修复观察到的问题是指定正确的长度修改器。
sprintf(..., "%hhX", ~OWReadByte());
没有铸造,不需要精确度。