sprintf 在 C 中毫无理由地将 FF 放在前面

sprintf puts FF infront without any reason in C

我在使用 sprintf 时遇到了这个奇怪的问题,它把 FF 放在我拥有的值前面。

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

我的代码是这样的

while(1)
{

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

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

一元运算符~改变了整个int的位,而不仅仅是低8位。 ~0xfeu(等价于 ~0x00feu)对于 16 位 int0xff01u

我建议在进行位操作时始终使用无符号类型,将负数 int 传递给 %X 严格来说是未定义的行为。

要去掉高位,你可以这样做

sprintf(&str_2[i * 2], "%02X", ~OWReadByte() & 0xffu);

假设至少是 C99,解决观察到的问题的最简单直接的方法是指定正确的 length modifer(s).

sprintf(..., "%hhX", ~OWReadByte());

无需转换,无需精度。