C语言位移、不同长度赋值操作

移位问题

向下函数传入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

不丢失精度