在视觉工作室中以十六进制移位并通过cout输出

时间:2017-08-20 18:28:48

标签: c++ hex visual-studio-2017 byte-shifting

我目前正在尝试通过在线教程学习c ++。本教程向我展示了如何使用SDL2创建程序,我在其中一个涉及十六进制位移的教程中迷失了方向。当我使用Visual Studio社区2017时,讲师正在使用Eclipse IDE。基本上我正在尝试做的是“cout”输出:FF123456使用他在教程中演示的代码。

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;

int main()
{
//0xFF123456 we want the resulting hexadecimal below to look like the one up here using the unsigned chars and build it sequentially byte after byte

unsigned char alpha = 0xFF;
unsigned char red = 0x12;
unsigned char blue = 0x34;
unsigned char green = 0x56;

unsigned char color = alpha;

color += alpha;
color <<= 8; //moves all the values in the color by 8 bits to the left 
color += red;
color <<= 8;
color += blue;
color <<= 8;
color <<= green;


cout << setfill('0') << setw(8) << hex << color << endl; 
return 0;
}

但是,每次运行程序时,cout只会显示“0000000”而不是FF123456。我有什么问题或错过了吗?

1 个答案:

答案 0 :(得分:0)

你的color是一个无符号字符,代表一个字节,而不是四个字节。因此,每个班次<<= 8实际上将删除之前分配的任何内容。 对unsigned int使用uint32_t或更好的color类型。此外,您使用color的值初始化alpha,然后再次添加alpha。建议使用color初始化0

uint32_t color = 0;

color += alpha;
color <<= 8; //moves all the values in the color by 8 bits to the left
color += red;
color <<= 8;
color += blue;
color <<= 8;
color += green;

cout << setfill('0') << std::uppercase << setw(8) << hex << color << endl;

输出:

FF123456

BTW:修正拼写错误,将color <<= green更改为color += green。 而且,对于ge FF123456而不是ff123456,我添加了std::uppercase