前情题要
这几天在做使用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; //算术移位