如何在保留值的同时将c ++无符号char变量转换为char变量

时间:2018-10-23 02:39:58

标签: c++ casting

抱歉,我遍历了代码,找到了问题所在。

我希望用C ++方法转换数字。原始变量是unsigned char,我将其存储在char变量a中。现在,我需要将此a强制转换为double,同时保持其原始无符号值。我该怎么办?

编辑:
我没想到我的问题会如此令人困惑。这是一个简短的示例

unsigned char a;
double b;
a = 140;
char c = static_cast<char>(a);
b = static_cast<double>(c);
std::cout << b << std::endl;

这将打印出-116的结果,但我实际上希望是双140。那我该怎么办呢?

编辑v2:

场景是这样的:我使用fstream从文件中读取了1024个字节。 1024个字节包含int号和unsigned char号。我想将这些unsigned char数字转换为double类型。我将它们全部简单地读取到std::vector<char>数组中,然后需要解压缩这些数字。其中的一部分将转换为double,而我在这里遇到了问题。

如果我的问题是由于滥用c ++引起的,请问处理此任务的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

这有效:

b = static_cast<double>(static_cast<unsigned char>(c));

或:

b = static_cast<unsigned char>(c);

或:

b = c < 0 ? c + 256 : c;

答案 1 :(得分:0)

在c ++中,char的最大值为127,在赋值:char a = 128;中,您实际上得到的是char的最小值,即-128,这意味着140将给你结果-116。要解决此问题,请使用最大值为255的unsigned char。请查看链接中“最大值/最小值”类型的表。 https://msdn.microsoft.com/en-us/library/7fh3a000.aspx

unsigned char a = 140;
int b = a;
cout << b << endl; // 140

答案 2 :(得分:0)

140的值存储在char变量中时,该字符的值将超出-128到+127的范围。

140的值转换为-119的机制取决于实现。

然后将-119的值转换为double并以-119的形式显示为double。

您可以做的是直接将未签名的字符数转换为两倍。这样可以解决您的范围问题。

unsigned char a;
a = 140;
b = static_cast<double>(a);
std::cout << b << std::endl;