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 位 int
是 0xff01u
。
我建议在进行位操作时始终使用无符号类型,将负数 int
传递给 %X
严格来说是未定义的行为。
要去掉高位,你可以这样做
sprintf(&str_2[i * 2], "%02X", ~OWReadByte() & 0xffu);
假设至少是 C99,解决观察到的问题的最简单直接的方法是指定正确的 length modifer(s).
sprintf(..., "%hhX", ~OWReadByte());
无需转换,无需精度。
我在使用 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 位 int
是 0xff01u
。
我建议在进行位操作时始终使用无符号类型,将负数 int
传递给 %X
严格来说是未定义的行为。
要去掉高位,你可以这样做
sprintf(&str_2[i * 2], "%02X", ~OWReadByte() & 0xffu);
假设至少是 C99,解决观察到的问题的最简单直接的方法是指定正确的 length modifer(s).
sprintf(..., "%hhX", ~OWReadByte());
无需转换,无需精度。