将24位二进制补码转换为int?

问题描述 投票:0回答:2

我有一个 C#/Mono 应用程序,可以从 ADC 读取数据。我的读取函数将其返回为 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
2个回答
5
投票
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个有符号整型中可以存储的最大可能正值,因此如果该值小于或等于该值,则应按原样返回。否则,值是两个补码负数的无符号表示。二补码的工作方式是将负数写为对
MODULO
取模的数,这实际上意味着
MODULO
相加。因此,为了将其转换回有符号,我们减去
MODULO


0
投票

最简单、最快的算法是与 (1 << 23) and then subtracting (1 << 23) from the result:

    const int Val = 1 << 23;
    
    int transform(int value) {  
      return (value ^ Val) - Val;
    }
© www.soinside.com 2019 - 2024. All rights reserved.