将无符号字符指针转换为字符指针

7

这是我的代码:

std::vector<unsigned char> data;
... // put some data to data vector
char* bytes= reinterpret_cast<char*>(imageData.data());

我的问题是,在向量“data”中,我有值为255的字符。在转换为字节指针后,我得到的值是-1,而不是255。如何正确地转换这些数据?
编辑:
好的,现在问题变成了我只需要位顺序,而不是转换。感谢您的帮助。

4
当将char视为有符号数时,-1与255具有相同的比特模式。有符号字节只能表示-128..+127的值。 - Michael
2
你真正想做什么?255 将会变成 -1,所以你无法让它工作。 - doctorlove
1
如果您正在使用一个期望 char * 而不是 unsigned char * 的图像库,不必担心重新解释转换(reinterpret_cast),它完美地完成了工作。当将数据用作整数值进行算术运算时,有符号性将非常重要。 - SirDarius
2个回答

6

char类型可以根据平台的不同而有符号或无符号。如果它是有符号的,就像在您的平台上一样,它有一个标准保证的范围从-128127。对于常见的平台,它是一个8位类型,因此它只能容纳这些值。这意味着你不能用char表示255

现在来解释一下你看到的东西:现代处理器中有符号数的典型表示是二进制补码,其中-1具有最大可表示比特模式(全部为1),与无符号char255相同。因此强制转换正好做了你要求的事情:将unsigned char重新解释为(signed) char

然而,我无法告诉您如何正确转换数据,因为这取决于您想要做什么。如果您正在做的方式对您的目的来说是可以接受的,那么这种方法可能很好,否则您唯一的选择是更改数据类型。


2
这个程序按照预期工作。你的char类型大小为1字节,相当于8位。如果它是无符号的,所有位都用来保存数值,这使得一个char能够保存的最大值为255(28=256种不同的值,从0开始)。
对于signed char,其中一位用来保存符号而不是数值,这就只剩下7位用来保存数值,允许存储-128到127之间的数字。
因此,当你在unsigned char中保存255时,所有位都被解释为该值,因此你有255。如果你将其转换为signed char,第一位开始被视为符号位,并且变量中的数据开始被解释为-1。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接