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

Char to int8_t conversion gives unexpected results?

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

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

我的次要目标是将字符文件读入一个数组,其中每个元素都表示为 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);