我在Arduino上使用24位I2C ADC,没有3字节(24位)数据类型,所以我使用了32位无符号整型的uint32_t
。然而,我的实际输出是一个24位有符号数,如下图所示:
如果你感兴趣的话,这里还有我用来读取结果的代码:
uint32_t readData(){
Wire.beginTransmission(address);
Wire.write(0x10);
Wire.endTransmission();
Wire.requestFrom(address,3);
byte dataMSB = Wire.read();
byte data = Wire.read();
byte dataLSB = Wire.read();
uint32_t data32 = dataMSB;
data32 <<= 8;
data32 |= data;
data32 <<= 8;
data32 |= dataLSB;
return data32;
}
为了使这个数字有用,我需要将它转换回24位有符号整数(我不知道如何做到这一点,或者如果可能的话,因为24不是2的幂),所以我有点卡住了。这将是伟大的,如果有人可以帮助我,因为我几乎完成了该项目,这是最后几个步骤之一。
3条答案
按热度按时间sczxawaw1#
从
uint32_t
中的24位二进制补码到int32_t
的转换可以通过以下方式完成:x & 0xffffff
确保该数字在第23位以上没有伪位。如果确定没有设置这样的位,则该行可以仅为int32_t t = x;
。然后
t >> 23
删除0到22位,只保留23位,这是24位整数的符号位。然后<< 24
对此进行缩放,生成0(对于正数)或224(对于负数)。从t
中减去该值即可得到所需的值。sshcrbum2#
问题是在C语言中没有安全和可移植的方法来使用移位来扩展符号-最多是实现定义的。因此,如果你想以可移植的方式完成它,你需要手动将2s补码值转换为有符号整数。
这将在uint32_t中获取24位二进制补码值,并将其转换为(有符号)int32_t。
a6b3iqyw3#
使用
int32_t
代替unit32_t
作为data32
。然后在返回值之前,将其左移8,然后右移8以符号扩展它。这段代码: