为什么固定宽度的整数输出的是字符而不是整型?
Why do fixed-width integers print out chars instead of ints?
给出以下代码:
#include <cstdint>
#include <iostream>
#include <limits>
int main()
{
int8_t x = 5;
std::cout << x << 'n';
int y = 5;
std::cout << y;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
std::cin.get();
return 0;
}
我的输出是三叶草和5。如果固定宽度的整数是整数,为什么他们输出他们的数字的ASCII字符符号?
编辑:刚刚发现这种行为只发生在8位固定宽度的整数?这是编译器行为吗?
它们是整数,因为你可以用它们做8位整数运算。
但显然在您的系统上,int8_t
被实现为typedef
到signed char
。这是完全合法的,因为signed char
s也是整数,但是会产生意想不到的结果,因为signed char
s的operator<<
打印它们的字符符号而不是它们的数值。如果有人试图打印signed char
,其他任何东西都会很奇怪。
如果您想看到int8_t
的数值,只需在打印前转换为int
。
(可选的)固定宽度类型intN_t
,以及其他各种类型,如uint_fast16_t
, uintmax_t
和intptr_t
,都是一个内置整型的别名。您不知道它们混叠的实际类型是什么,只知道它们必须满足文档约束。
在"正好8位"的情况下,约束没有留下太多的空间,但是,唯一可以8位宽的整型是char
类型(回想一下,有三个类型)。所以int8_t
,如果存在的话,一定是char
或signed char
的别名。
与此无关,iostreams为operator<<
定义了所有字符类型的重载,这些字符类型具有将值直接写入输出的效果,而不是将整数格式化为十进制字符串(这样您可以方便地编写std::cout << 'a'
),并且该重载也用于int8_t
——重载解析适用于类型,而不是类型名称。(可能令人遗憾的是,signed char
有一个特殊的ostream重载;如果只是为char
提供重载,并将其他类型视为普通整数,可能会更好。)这就是为什么在系统编码中会看到该值以字符的形式打印。
如果你想打印格式化为字符串的值,只需将其转换为更宽的整型之一。例如,您可以使用一元加号应用标准促销:int8_t x = 5; std::cout << +x;
- C 字符串返回字符串的整数/双精度/长整型值
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- JNI 日期值转换问题,在C++中获取不同的长整型值
- 将长整型值打印为带有前导零的十六进制
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 将整型常量映射到类型
- 将元组和整型实例合并到引用元组中
- 提升不良词法强制转换:将字符串转换为无符号长整型时,无法将源类型值解释为目标
- 为什么C++不允许两个同名的函数/类模板,区别仅在于非类型模板参数(整型)的类型?
- 将最小值整数转换为无符号长整型
- C++ 从文件中读取字符,转换为长整型
- 整型转换为字符数组
- 不能同时将ASCII字符转换为整型和十六进制
- 将无符号字符数组转换为整型
- 制作一个将字符串转换为整型和字符的计算器
- 将字符数组转换为整型数组
- 如何将表示像素的字符数组读取为无符号整型
- 为什么固定宽度的整数输出的是字符而不是整型?
- 如何从数组中向后读取十六进制字符并将其转换为整型