【问题标题】:3 byte signed value to 4byte signed value3 字节有符号值到 4 字节有符号值
【发布时间】:2014-11-26 02:47:34
【问题描述】:

我有一个 3 字节的有符号值:

0xffe8a4

我需要存储在 4 字节有符号(32 位)INT 中,因为符号位位于第 24 位,直接转换为 32 位 INT 不会保留值的负元素,因此将其更改为正数。

如何转换为 32 位数字并保留原始预期值?

提前致谢!

【问题讨论】:

  • 你把这些 3 字节的有符号值保存在哪里了?什么数据类型?
  • 它是由作为数据包一部分的无符号字节数组构建的
  • 在合理设计任何代码之前必须问的第一个问题是:您的 3 字节整数是如何存储的?

标签: c int signed


【解决方案1】:

如果是正数:

0xffe8a4 -> 0x00ffe8a4

如果是负数:

0xffe8a4 -> 0xffffe8a4

使用 |>> 运算符

【讨论】:

    【解决方案2】:

    在这里,您需要获取数字的绝对值才能将其存储在常规 int 中。

    int val = 0xffe8a4 ;
    val = -(((~val)&0xffffff) + 1); // val is now the negative number stored as a 4 byte int
    // val = ~((~val)&0xffffff); also works ;)
    

    你也可以这样进行:

    int val = 0xffe8a4;
    val = val|((val&0x80000)*0xff000000);
    

    【讨论】:

      【解决方案3】:

      您可以测试符号位,如果是0,则在您的编号前加上0x00,否则在其前加上0xff。 像这样(警告:没有测试过):

      int yourCustomNumberIsStoredHere = 0xffe8a4; //I know it won't actually be your number, because int is 4 byte, but I don't know how your store it in your program.
      int result = yourCustomNumberIsStoredHere;
      if (yourCustomNumberIsStoredHere & (0x80 << 16))
          result |= 0xff << (24);
      

      关于该主题的参考:Wikipedia: Two's complement (how negative numbers are stored in memory)

      【讨论】:

        【解决方案4】:

        如果你的数据是内存中三个单独寻址的字节,那么

        int32 result = ((int)(signed char) HiByte << 16)
                     + ((unsigned char)MidByte << 8) + (unsigned char) LoByte;
        

        第一项强制进行符号位扩展(通过将有符号字节转换为 int),剩余部分只是在结果值中定位八位字节。输入字节的单独寻址确保结果在大端和低端系统中都是正确的。

        【讨论】:

          猜你喜欢
          • 2015-01-17
          • 2017-10-01
          • 2011-10-21
          • 2013-07-19
          • 1970-01-01
          • 1970-01-01
          • 2014-12-06
          • 2016-11-19
          • 2015-01-12
          相关资源
          最近更新 更多