c++ - Char 到 int8_t 的转换给出了意想不到的结果?

标签 c++ char type-conversion byte uint8t

为什么将 char 转换为 int8_t 总是给我字母(char)表示而不是数值?

char 转换为 int16_tint 会得到预期的数值。

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

我的次要目标是将字 rune 件读入一个数组,其中每个元素都表示为 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 的别名(或 signed char )因此被

std::ostream& operator<<(std::ostream&, char);

当你流式传输它时,正如你所注意到的,输出的是字符而不是它的数值。

因此,要输出 int8_t的(或 char 的)数值,您需要转换:

std::cout << static_cast<int>(variable);

关于c++ - Char 到 int8_t 的转换给出了意想不到的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59040986/

相关文章:

time_t 的 C 字符串表示

c++ - 是否可以使用 g++ 或 clang++ 获取矢量化报告 - openmp

c++ - 为什么这会在控制台中返回一个地址?

java - 使用 JNI 将 C++ 类成员函数绑定(bind)到 Java

C语言中字符转二进制

MYSQL警告无效的utf8字符串

c# - C# 中的 "is"和 "as"运算符

c++ - 为什么 C++ 原始类型不像其他类型那样被初始化?

c - 二维字符数组

C 编程复制子字符串