sprintf在没有任何理由的情况下将FF放在了前面

时间:2015-01-21 11:09:41

标签: c microcontroller led lcd

我有这个奇怪的问题,我使用的是sprintf,它将FF放在我拥有的值之前。

(例如)我应该得到01,但我得到FF01

我的代码看起来像这样

while(1)
{

    if(getkey()=='g')
    {
       sprintf(str_2, "%X", ~OWReadByte());
       lcd_delay();
       lcd_string(str_2);
    }
}

我对LED做了一些检查,在那里我得到了我想要的价值,在使用sprintf后它就搞砸了。

2 个答案:

答案 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());

没有铸造,不需要精确度。