【发布时间】:2018-02-08 15:47:49
【问题描述】:
我在 8 位 EFM8 MCU 上使用 Keil Cx51 编译器。
如果我有一个函数,foo(),像这样:
xdata char buf[32];
void foo(char *msg, ...)
{
va_list args;
va_start (args, msg);
vsprintf(buf, msg, args);
va_end(args);
}
我是这样使用它的:
foo("My number is %d", 1);
buf 将包含:“我的号码是 256”。
如果我将调用更改为:
foo("My number is %d", (uint16_t)1);
然后buf 将包含“我的号码是1”,正如预期的那样。
为什么vsprintf() 将数字 1 (0x0001) 移位 8 位到 256 (0x0100) 而不进行强制转换?这是字节序问题吗?
【问题讨论】:
-
看起来更像是一个整数提升问题。 Keil 对此做了have a web page。
-
感谢您的链接。我只是按照说明禁用了整数提升并重新测试 - 问题仍然存在。我正在使用 Cx51 v9.53。
-
这是倒退的,您希望启用它。请考虑发布汇编代码。
-
默认开启。请参阅随附的程序集了解启用它的情况。
-
问:Keil C 中
1表达式的数据类型是什么?而且,%d期望什么数据类型?在 C 编程语言中,这两个问题的答案都是int;但是Keil C不是C。我已经很久没有为8052写代码了,但是如果我不得不猜测,我猜1的数据类型可能是char。