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

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

我有一个 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

我该怎么做?

最佳答案

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

关于c# - 将 24 位二进制补码转换为 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48830561/

相关文章:

c# - 单声道,c#,套接字,性能

C#检查哪个整数更大

java - 谈论整数时,32 位/8 位和补码是什么意思?

C++从文件中读取整数并保存到数组中

c# - 在泛型函数中访问类型名称的静态字段

c# - 文件比较实用程序

c# - property.setting 值存储在 c# windows 应用程序中

c# - EF Core Fluent API 配置防止 TPC 继承

c# - 单声道 GTK# : Trying to remove text in ComboBox and then prepend new text to the ComboBox but some of the old text remains

java - 在 Ubuntu 中使用 Mono 生成文件的字节顺序标记