You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将24位补码转换为int?C#/Mono读取ADC数据转换方法

解决C#/Mono中补码转换的两个问题

嘿,我来帮你搞定这两个ADC数据转换的问题,都是关于补码转有符号整数的,咱们一步步来:

1. 将ulong类型的二进制补码转换为int

首先要明确:你的ADC返回的ulong其实是有符号整数的补码表示,但存储在了无符号的ulong里。核心是把这个无符号值还原成对应的有符号int。

最简洁的方法是用unchecked关键字,默认情况下C#会检查数值溢出并抛出异常,而unchecked会忽略溢出,直接按补码规则转换:

ulong adcUlongValue = 你的ADC读取结果;
int convertedInt = unchecked((int)adcUlongValue);

原理说明:

  • 如果adcUlongValue的最高位(第31位)是0,那它本身就是正数,强制转换后直接得到正确的int值。
  • 如果最高位是1(表示负数),unchecked会让C#直接把ulong的二进制位当作int的补码来解析,自动得到对应的负数值,不用手动计算。

如果你不想用unchecked,也可以手动判断计算:

ulong adcUlongValue = 你的ADC读取结果;
int convertedInt;

if (adcUlongValue <= int.MaxValue)
{
    convertedInt = (int)adcUlongValue;
}
else
{
    // 计算补码对应的负数:用ulong的最大值减去当前值再加1,取反
    convertedInt = -(int)((ulong.MaxValue - adcUlongValue) + 1);
}

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

24位补码的关键是符号扩展:因为int是32位,所以需要把24位的符号位(第23位)扩展到32位的最高位(第31位),这样才能正确表示负数。

假设你的24位补码数据存储在ulong的低24位里,下面是两种实现方式:

方法1:手动判断+符号扩展

ulong adcUlongValue = 你的ADC读取结果;
// 先提取低24位的补码数据
ulong twentyFourBitComplement = adcUlongValue & 0xFFFFFF;
int convertedInt;

// 判断24位的符号位(第23位)是否为1
if ((twentyFourBitComplement & 0x800000) == 0)
{
    // 正数,直接转换
    convertedInt = (int)twentyFourBitComplement;
}
else
{
    // 负数,把高8位都设为1(符号扩展),再转成int
    convertedInt = (int)(twentyFourBitComplement | 0xFF000000);
}

方法2:移位实现自动符号扩展

这是更简洁的写法,利用算术右移会自动填充符号位的特性:

ulong adcUlongValue = 你的ADC读取结果;
ulong twentyFourBitComplement = adcUlongValue & 0xFFFFFF;
// 左移8位把24位的符号位移到32位int的符号位,再算术右移8位完成扩展
int convertedInt = (int)(twentyFourBitComplement << 8) >> 8;

原理说明:

  • 左移8位:把24位数据的最高位(符号位)移动到32位int的第31位(也就是int的符号位)。
  • 算术右移8位:C#中int的右移是算术移位,会用符号位填充高位,这样就自动完成了从24位到32位的符号扩展,得到正确的有符号int值。

内容的提问来源于stack exchange,提问作者Cristian M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:41:56