所以,我意识到 %u
用于打印 unsigned int
。在大多数系统上,unsigned int
通常不止一个字节(我认为通常是 32 位/4 字节)。 unsigned char
总是一个字节。那么,使用 %u
格式说明符将字节打印为数字是否安全?类型提升会开始吗?还是可变参数列表搞砸了?这是一个简单的例子:
#include <stdio.h>
int main()
{
unsigned char val = 'A';
printf("%u", val); // is this safe?
}
假设是 ASCII 编码,输出应该是 65
。但是,由于 %u
在技术上适用于 unsigned int
而不是 unsigned char
,我很好奇是否存在我会获取字节的情况垃圾,或以意想不到的方式访问堆栈。
最佳答案
%u
需要一个 unsigned int
,因此在将它传递给 %u< 时您必须转换
,例如:unsigned char
/
printf( "%u", (unsigned int) val );
很有可能当按原样传递 unsigned char
时,它会提升到 unsigned int 的大小
当被推送到调用堆栈时,在这种情况下 %u
可能 无需强制转换即可工作,但您不应依赖该行为。只需传递正确的类型即可。
或者,您可以使用 %hhu
代替 (C99+),它需要一个 unsigned char
,例如:
printf( "%hhu", val );
关于c++ - 通过 printf 函数打印带有 %u 说明符的 unsigned char 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74830065/