前情题要

这几天在做使用FIFO读取IMU的20bit高精度acc与gyro数据的时候发现,有一个符号转换的问题;

之前没发现有这个问题是因为,之前读取的数据都为16bit,正好能够填充到int16_t数据类型中,不需要符号位的转换。

需要了解的内容

无符号数与有符号数,正数与负数的表示

无符号数与有符号数区别在于有无符号位(最高位)

负数与正数的区别在于负数在计算机中是使用补码表示的

逻辑移位与算术移位

对于无符号数来说,右移为逻辑右移,最高位补0

对于有符号数来说,右移为算术右移,根据符号位决定最高位补1还是补0;符号位为1(负数)右移补1,反之,符号位为0(正数)右移补0;

解决方法

假如我有一个20位的有符号数a,则第19位为符号位;

int32_t convertTos32 = a<<12;	//把第19位移到第31位符号位
convertTos32 >>=12;	//算术移位

山和山不相遇,人与人要相逢