Char 到 int8_t 的转换给出了意想不到的结果?
Char to int8_t conversion gives unexpected results?
为什么将 char
转换为 int8_t
总是给我字母(字符)表示而不是数值?
将 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
(或 signed char
) 并因此被
选中
std::ostream& operator<<(std::ostream&, char);
当你流式传输它时,正如你所注意到的,输出的是字符而不是它的数值。
因此,要输出 int8_t
(或 char
)的数值,您需要转换:
std::cout << static_cast<int>(variable);
为什么将 char
转换为 int8_t
总是给我字母(字符)表示而不是数值?
将 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
(或 signed char
) 并因此被
std::ostream& operator<<(std::ostream&, char);
当你流式传输它时,正如你所注意到的,输出的是字符而不是它的数值。
因此,要输出 int8_t
(或 char
)的数值,您需要转换:
std::cout << static_cast<int>(variable);