c++ - Char 到 int8_t 的转换会产生意想不到的结果?
问题描述
为什么转换char
为int8_t
一直给我字母(char)表示而不是数值?
转换char
为int16_t
或int
给我预期的数值。
char a = 'x';
std::cout << "Casting '" << a << "' (char) to (int8_t): " << (int8_t)a << '\n';
std::cout << "Casting '" << a << "' (char) to (int16_t): " << (int16_t)a << '\n';
unsigned char b = 'y';
std::cout << "Casting '" << b << "' (uchar) to (uint8_t): " << (uint8_t)b << '\n';
std::cout << "Casting '" << b << "' (uchar) to (uint16_t): " << (uint16_t)b << '\n';
// Further example:
int8_t c = 'z';
int16_t d = 'z';
int e = 'z';
std::cout << c << '\n' << d << '\n' << e << '\n';
输出:
Casting 'x' (char) to (int8_t): x
Casting 'x' (char) to (int16_t): 120
Casting 'y' (uchar) to (uint8_t): y
Casting 'y' (uchar) to (uint16_t): 121
z
122
122
我的目标是将字符文件读入一个数组,其中每个元素都表示为0..255
值(无需任何进一步的转换)。
我的解决方案工作正常:
auto buffer = std::make_unique<unsigned char[]>(file_length); // <uint8_t> also works
file.read(reinterpret_cast<char*>(buffer.get()), file_length);
for (int i = 0; i < file_length; i++) {
std::cout << std::dec << (uint16_t)buffer[i] << std::endl;
}
但是,它仍然需要转换uint16_t
为十进制并解释为十进制,以便将结果打印为0..255
数字。
另一种选择是简单地uint16_t
用作数组的一种类型,这样除了解释为十进制之外,不会有进一步的转换,但是我仍然很好奇为什么uint8_t
不起作用。
谢谢。
解决方案
可选类型int8_t
不必存在,但是当它存在时,它通常char
是(or )的别名,signed char
因此被
std::ostream& operator<<(std::ostream&, char);
当您流式传输它时,正如您所注意到的,它输出字符而不是其数值。
因此,要输出int8_t
's(或char
's)数值,您需要转换:
std::cout << static_cast<int>(variable);
推荐阅读
- javascript - 您如何正确克隆 Javascript/JQuery 中的内容?
- python - Python 中的 Visual Studio 错误代码折叠
- druid - Apache Druid Schema 列添加
- java - 我需要帮助修复这段代码的一部分,我试图在多线程 java 中的另一条消息之后发出一条消息,但它不起作用,我该怎么办?
- c# - '4.6.0-preview6.19303.8' 不是有效的版本字符串。无法在 Visual Studio 2013 中安装 Nuget 包
- regex - Regex - Allow dash character in body text but not at start or end
- python - Python问题无法运行模块和输出问题
- laravel - 来自控制器的 Laravel 重定向给出“此路由不支持方法”错误
- database - 是否有理由不将加密数据作为二进制存储在数据库中?
- prometheus - Prometheus - 基于标签算法的条件