你的假设可能是正确的,也可能是不正确的。这取决于编译器的实现。所有现代(或者应该说是智能)编译器都会像你提到的那样做。但是 Keil,从版本开始。9.02,您需要为 printf 指定正确的可变长度。
这是 Keil C 处理各种 printf 函数的方式。您需要准确指定它的长度。所有正则都是 16 位(无符号)整数,包括 %d、%x 和 %u。对 8 位使用修饰符“b”,对 32 位使用修饰符“l”。如果你给了错误的长度,你会得到错误的数字。更糟糕的是,其余的变量都是错误的。例如,要使用 8 位 'char',您使用 '%bd'(%bu 和 %bx),而 %ld、%lu 和 %lx 用于 32 位 'long'。
char c = 0xab;
printf("My char number is correctly displayed as '0x%02bx'\n", c);
还要注意,同样,要从 sscanf 获取数字数据,也是一样的。以下示例是使用 sscanf 获取 32 位长变量:
long var;
char *mynum = "12345678";
sscanf(mynum, "%ld", &var);
变量 var12345678
后包含数字sscanf
。下面显示了 Keil 的 printf 系列中使用的变量的长度。
%bd, %bx, %bu - 应该用于 8 位变量
%d, %x, %u - 应该用于 16 位变量,并且
%ld, %lx, %lu - 应该用于 32 位变量