从 `int` 转换为 `unsigned char`

use*_*326 6 c++ casting unsigned-char

我在Coliru上运行以下 C++ 代码:

#include <iostream>
#include <string>

int main()
{
     int num1 = 208;
     unsigned char uc_num1 = (unsigned char) num1;
     std::cout << "test1: " << uc_num1 << "\n";

     int num2 = 255;
     unsigned char uc_num2 = (unsigned char) num2;
     std::cout << "test2: " << uc_num2 << "\n";
}
Run Code Online (Sandbox Code Playgroud)

我得到输出:

test1: ?

test2: ?
Run Code Online (Sandbox Code Playgroud)

这是我的代码的简化示例。

为什么不打印出来:

test1: 208

test2: 255
Run Code Online (Sandbox Code Playgroud)

我是在滥用std::cout,还是我没有正确地进行铸造?


更多背景

我想从 转换intunsigned char(而不是unsigned char*)。我知道我所有的整数都在 0 到 255 之间,因为我在 RGBA 颜色模型中使用它们。

我想使用LodePNG对图像进行编码。图书馆 inexample_encode.cpp使用unsigned chars in std::vector<unsigned char>& image

//Example 1
//Encode from raw pixels to disk with a single function call
//The image argument has width * height RGBA pixels or width * height * 4 bytes
void encodeOneStep(const char* filename, std::vector<unsigned char>& image, unsigned width, unsigned height)
{
  //Encode the image
  unsigned error = lodepng::encode(filename, image, width, height);

  //if there's an error, display it
  if(error) std::cout << "encoder error " << error << ": "<< lodepng_error_text(error) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ric 4

std::cout 是正确的 =)

按 ALT,然后按 2 0 8 这是您使用 test1 打印的字符。控制台可能不知道如何正确打印它,因此它输出问号。与 255 相同。读取 png 并将其放入 std::vector 后,将其写入屏幕是没有用的。该文件包含不可写的二进制数据。

如果你想看到“208”和“255”,你不应该先将它们转换为unsigned char,或者指定你想要打印数字,例如int,就像这样

std::cout << num1 << std::endl;
std::cout << (int) uc_num1 << std::endl;
Run Code Online (Sandbox Code Playgroud)

您正在查看 std::cout 的一个特殊情况,它一开始并不容易理解。

当调用 std::cout 时,它会检查右侧操作数的类型。在您的情况下,std::cout << uc_num1告诉 cout 操作数是一个无符号字符,因此它不执行转换,因为无符号字符通常是可打印的。尝试这个 :

unsigned char uc_num3 = 65;
std::cout << uc_num3 << std::endl;
Run Code Online (Sandbox Code Playgroud)

如果你写std::cout << num1,那么 cout 会意识到你正在打印一个 int 。然后它会将 int 转换为字符串并为您打印该字符串。

您可能想要检查 c++ 运算符重载以了解它是如何工作的,但目前它并不是非常重要,您只需要意识到 std::cout 对于您尝试打​​印的不同数据类型可能有不同的行为。