【问题标题】:Convert 24 bit two's complement to int?将 24 位二进制补码转换为 int?
【发布时间】:2018-02-16 16:03:42
【问题描述】:

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

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

我该怎么做?

【问题讨论】:

    标签: c# mono integer data-conversion twos-complement


    【解决方案1】:
    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 个带符号整数中的最大可能正值,因此如果该值小于或等于该值,则应按原样返回。否则 value 是二补数负数的无符号表示。二补码的工作方式是将负数写为以MODULO为模的数字,这实际上意味着添加了MODULO。因此,要将其转换回已签名,我们减去 MODULO

    【讨论】:

    • 谢谢。它适用于负值,但是,例如,transform(0x7FFFFF) 给出 -8388609。你知道是什么问题吗?
    • @CristianM 对我来说,它应该返回83886070x7FFFFF 正好是 MAX_VALUE,所以不执行 if 语句。可以尝试再次运行吗?
    • 它有效。我必须把它写成 const int MAX_VALUE = ((1
    猜你喜欢
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 2016-07-16
    • 2011-04-18
    • 2021-02-23
    相关资源
    最近更新 更多