std::format对signed/unsigned char表现不同是否符合标准?
std::format对signed char与unsigned char的输出差异是否符合标准?
在使用VC编译器时,发现std::format对signed char和unsigned char的输出表现存在差异,核心疑问是:这种行为是否符合C++标准?示例代码如下:
示例1(signed char)
char s = 'R'; std::cout << s << std::endl; // 输出 R std::cout << std::format("{}\n", s); // 输出 R
示例2(unsigned char)
unsigned char u = 'R'; std::cout << u << std::endl; // 输出 R std::cout << std::format("{}\n", u); // 输出 82
示例2中std::format输出82而非R,这是预期行为,完全符合C++标准,而非Bug。两者行为差异的原因如下:
- std::cout的输出逻辑:
std::cout的operator<<为char、signed char、unsigned char都提供了专门的重载,无论哪种类型,都会被当作字符类型处理,输出对应的ASCII字符。 - std::format的输出逻辑:默认格式说明符
{}会遵循参数提升规则:signed char会被提升为int,但std::format会识别其原始类型为字符类,因此按字符输出;unsigned char会被提升为unsigned int,此时std::format将其当作无符号整数处理,输出对应的ASCII数值('R'的ASCII码为82)。
内容的提问来源于stack exchange,提问作者Pavan Chandaka
相关产品推荐
相关产品推荐

