移位问题
向下函数传入0x00800000和0x00400000分别返回什么?

这还用想,当然返回原值了。然而实际却是返回了0xff800000和0x00400000
为什么0x00800000会返回0xff800000,而0x00400000返回了原值?
先看程序运行过程,首先temp先左移了八位,变成0x80000000,这是没有问题的,再右移八位后却变成了0xff800000。这是因为c语言对无符号类型数据的移位均为空位补零,但是对于有符号类型的右移却根据最高位决定,最高位为1则补1,反之则补零,所以0x00800000变换为0xff800000,而0x00400000返回原数值,但将数据类型改为无符号时则无此规律。
不同类型赋值问题
已知cannle为u32,p_Temp为s32 分析下列赋值过程

首先u32和s32长度等长,区别在于最高位是否有符号位,这种赋值二进制数值不变,但是在打印时候按不同类型解析。
其次,将长值赋值给短值,截取低位,然后再赋给短值(即丢弃长值中高于短值最高位的所有值)
其实上述过程只是将int 32类型拆分开存储。发送给上位机后,上位机可将其视为一个int32数据。
赋值类型补充
| 整数与整数之间 | |
|---|---|
| 短值赋给长值 | 短整数直接高位补0 |
| 两个无符号数据 | 短整数符号拓展 |
| 两个有符号类型 | |
| 一个有符号,一个无符号 | 短整数先进行位数拓展,过程保持数为不变,然后按长整数的数据类型解析数据 |
整数与浮点数之间
浮点数转整型
截取整数部分
整型转浮点型
小数部分为零,整数部分不变
double & float
double->float
丢失数据精度
float->double
不丢失精度