将 24 位二进制补码转换为 int?
Convert 24 bit two's complement to int?
我有一个从 ADC 读取数据的 C#/Mono 应用程序。我的阅读功能 returns 它作为 ulong。数据是两个补码,我需要将其转换为 int。例如:
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 signed int 中可以存储的最大可能正值,因此如果该值小于或等于该值,则应按原样返回。否则值是 two-complement 负数的无符号表示。 two-complement 的工作方式是将负数写成对 MODULO
取模的数字,这实际上意味着添加了 MODULO
。因此,要将其转换回带符号的形式,我们减去 MODULO
.
我有一个从 ADC 读取数据的 C#/Mono 应用程序。我的阅读功能 returns 它作为 ulong。数据是两个补码,我需要将其转换为 int。例如:
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 signed int 中可以存储的最大可能正值,因此如果该值小于或等于该值,则应按原样返回。否则值是 two-complement 负数的无符号表示。 two-complement 的工作方式是将负数写成对 MODULO
取模的数字,这实际上意味着添加了 MODULO
。因此,要将其转换回带符号的形式,我们减去 MODULO
.