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

C# 将24位2的补码转换为int?,c#,mono,integer,data-conversion,twos-complement,C#,Mono,Integer,Data Conversion,Twos Complement,我有一个C/Mono应用程序,可以从ADC读取数据。我的read函数将其返回为ulong。数据有两种补充形式,我需要将其转换为整数。例如: 0x7FFFFF = + 8,388,607 0x7FFFFE = + 8,388,606 0x000000 = 0 0xFFFFFF = -1 0x800001 = - 8,388,607 0x800000 = - 8,388,608 我该怎么做 const int MODULO = 1 << 24; const int MAX_VALUE

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

0x7FFFFF = + 8,388,607
0x7FFFFE = + 8,388,606
0x000000 = 0
0xFFFFFF = -1
0x800001 = - 8,388,607
0x800000 = - 8,388,608
我该怎么做

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符号整数中的最大可能正值,因此如果该值小于或等于该值,则应按原样返回。否则,该值是两个补码负数的无符号表示。两个补码的工作方式是将负数写成一个数模,这实际上意味着模被加上。因此,要将其转换回有符号,我们减去模。

谢谢。它适用于负值,但是,例如,transform0x7FFFFF给出了-8388609。你知道问题出在哪里吗?@CristianM对我来说,它返回的是8388607。0x7FFFFF正好是MAX_值,因此不执行if语句。可能会再次尝试运行吗?它有效。我必须把它写成const int MAX_VALUE=1