例如,我在C ++中使用printf
函数用于8位CPU(AVR)。以下代码是否安全:
uint8_t a = 5;
printf("%d", a);
这里%d
期望int
(在我的情况下为16位,在任何情况下至少为16位),但我传递的是8位整数。
C / C ++标准是否保证排名小于int
的任何类型都提升为int
?
float a
和%f
预期double
以及其他类似类型的问题。
答案 0 :(得分:14)
查看草稿n1256 (C99 with Technical corrigenda TC1, TC2, and TC3 included)中的6.5.2.2 Function calls
:
对于没有原型的函数或与省略号...
对应的参数,将执行默认参数提升。
这些是:float
到double
的默认整数促销和宣传。
默认整数提升:小于int
的每个整数类型的提升都会提升为int
或unsigned int
。