我在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";
}
我收到了输出:
test1: �
test2: �
这是我的代码的简化示例。
为什么不打印出来:
test1: 208
test2: 255
我是否误用了std::cout
,还是我没有正确地进行投射?
更多背景
我想从int
转换为unsigned char
(而不是unsigned char*
)。我知道我的所有整数都在0到255之间,因为我在RGBA颜色模型中使用它们。
我想使用LodePNG对图片进行编码。 example_encode.cpp
中的库使用unsigned char
中的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;
}
答案 0 :(得分:2)
std :: cout是正确的=)
按ALT然后按2 0 8 这是使用test1打印的char。控制台可能不知道如何正确打印,因此它输出问号。与255相同的事情。在读取png并将其放入std :: vector之后,没有使用它写入屏幕。该文件包含不可写的二进制数据。
如果要查看“208”和“255”,则不应首先将它们转换为unsigned char,或者指定要打印数字,例如int,例如,
std::cout << num1 << std::endl;
std::cout << (int) uc_num1 << std::endl;
您正在查看std :: cout的特例,一开始并不容易理解。
当调用std :: cout时,它会检查右侧操作数的类型。在您的情况下,std::cout << uc_num1
告诉cout操作数是无符号字符,因此它不执行转换,因为unsigned char通常是可打印的。试试这个:
unsigned char uc_num3 = 65;
std::cout << uc_num3 << std::endl;
如果你写std::cout << num1
,那么cout会意识到你正在打印一个int。然后它会将int转换为字符串并为您打印该字符串。
您可能想要检查c ++运算符重载以了解它是如何工作的,但它目前并不是非常重要,您只需要意识到std :: cout对于您尝试打印的不同数据类型可能会有不同的行为。