首页 > 解决方案 > Char 到 int8_t 的转换会产生意想不到的结果?

问题描述

为什么转换charint8_t一直给我字母(char)表示而不是数值?

转换charint16_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不起作用。

谢谢。

标签: c++chartype-conversionbyteuint8t

解决方案


可选类型int8_t不必存在,但是当它存在时,它通常char是(or )的别名,signed char因此被

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

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

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

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


推荐阅读