【问题标题】:Converting unsigned char * to char *将 unsigned char * 转换为 char *
【发布时间】:2013-09-23 00:04:21
【问题描述】:

这是我的代码:

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

我的问题是,在向量“数据”中,我有值 255 的字符。在字节指针中转换后,我的值是 -1 而不是 255。我应该如何正确转换这些数据?

编辑

好的,我真的不需要转换,只需要一个位顺序。感谢您尝试帮助

【问题讨论】:

  • -1 在查看有符号字符时与 255 的位模式相同。有符号字节只能表示值 -128..+127。
  • 你真正想做什么? 255 将是 -1,所以你不会让它工作。
  • 如果您使用的图像库需要 char * 而不是 unsigned char *,请不要担心 reinterpret_cast,它可以完美地完成工作。对用作整数值的数据执行算术运算时,符号很重要。

标签: c++ pointers type-conversion


【解决方案1】:

这可以正常工作。您的 char 类型的大小为 1 字节,等于 8 位。如果它是无符号的,则所有位都用于保存该值,这使得 char 可以保存的最大值为 255(28 = 256 个不同的值,从 0 开始)。

signed char 的情况下,使用一位来保存符号而不是值,这使您只剩下 7 个 bts 的值,允许存储从 -128 到 127 的数字。

因此,当您在unsigned char 中保存 255 时,所有位都被解释为值,因此您有 255。如果将其转换为 signed char,则第一位开始被视为符号位,并且变量中的数据开始被解释为-1。

【讨论】:

    【解决方案2】:

    char 可以签名或未签名,具体取决于平台。如果它被签名,就像在你的平台上一样,它的保证范围是从-128127 的标准。对于常见的平台,它是 8 位类型,所以这些是它可以保存的唯一值。这意味着您不能将255 表示为char

    现在解释一下您所看到的:现代处理器中带符号数字的典型表示是二进制补码,-1 具有最大可表示位模式(全为),这与 255 相同987654328@。所以演员完全按照你的要求去做:将unsigned chars重新解释为(signed) chars

    但是我不能告诉你如何正确转换数据,因为这取决于你想用它做什么。如果不是您唯一的选择是更改数据类型,那么您的操作方式可能适合您的目的。

    【讨论】:

      猜你喜欢
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      相关资源
      最近更新 更多