c++ - 通过 printf 函数打印带有 %u 说明符的 unsigned char 是否安全?

标签 c++ printf

所以,我意识到 %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/

相关文章:

c++ - std::cout 的更易于键入的替代方案,用于在 C++ 中打印到屏幕

c - 在c中将整数写入文件

c++ - 握手成功后 SSL_read() 不返回

c++ - Arduino C++ 中类似字典的数据结构

arrays - Matlab中字符串的动态格式化

c - 在 printf 参数中提升类型是否危险?

regex - 如何使用 sprintf 创建一个正则表达式来匹配文本文件中的 1 个但不超过 N 个连续单词?

c++ - 关闭 session 后 Tensorflow C++ 不释放 GPU 资源

c++ - opencl 程序没有给出正确的输出

c++ - 在另一个方法完成后立即调用一个方法