代码之家  ›  专栏  ›  技术社区  ›  Cristian M

将24位2的补码转换为int?

  •  2
  • Cristian M  · 技术社区  · 6 年前

    我有一个C#/Mono应用程序,可以从ADC读取数据。我的read函数将其返回为ulong。数据有两种补充,我需要将其转换为int。例如:

    0x7FFFFF = + 8,388,607
    0x7FFFFE = + 8,388,606
    0x000000 = 0
    0xFFFFFF = -1
    0x800001 = - 8,388,607
    0x800000 = - 8,388,608
    

    我该怎么做?

    1 回复  |  直到 6 年前
        1
  •  4
  •   sbeliakov Paul. B    6 年前
    const int MODULO = 1 << 24;
    const int MAX_VALUE = (1 << 23) - 1;
    
    int transform(int value) {
      if (value > MAX_VALUE) {
        value -= MODULO;
      }
      return value;
    }
    

    说明: MAX_VALUE 是可以存储在24符号int中的最大可能正值,因此如果该值小于或等于该值,则应按原样返回。否则,该值是两个补码负数的无符号表示。两个补码的工作方式是将负数写为数字模 MODULO ,这实际上意味着 模数 已添加。所以要把它转换回有符号的,我们减去 模数 .