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

时间:2018-02-16 16:03:42

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

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

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

我该怎么做?

1 个答案:

答案 0 :(得分: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 signed int中的最大可能正值,因此如果该值小于或等于该值,则应按原样返回。否则,值是二元补码负数的无符号表示。双补码的工作方式是将负数写为模MODULO的数字,这实际上意味着添加了MODULO。因此,要将其转换回签名,我们会减去MODULO