C语言中的强制转换、大端小端
一、C语言中变量存储格式之大端、小端
1、大端模式,数据高字节位存在内存的低地址中,而数据的低字节位存在内存的高地址中。数据从高位往低位放。和我们”从左到右“阅读习惯一致。
2、小端模式,数据的高字节位存在内存的高地址中,数据的低字节位存在内存的低地址中。这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
二、强制转换之u8-----> float 以及 u8 -----> int 以及 int ----> float
大端方式 进制转换可参考笔者另一篇博客:常用进制转换、卡号转换、韦根协议转换 - 耿通宇 - 博客园 (cnblogs.com)
42480000 转换为10进制为: 0 * 16^0 ..... + 8 * 16^4 + 4 * 16^5 + 2 * 16^6 + 4*16^7 = 1112014848
由笔者另一篇博客关于STM32编码方式、优化等级、Debug、代码内存、变量内存、内部Flash、RAM说明 - 耿通宇 - 博客园 (cnblogs.com可知,STM32中变量是按照小端方式存储。如下:0xCB17存储方式
三、强制转换之u8-----> struct
CMD len addr data
1Byte 2Byte 4Byte
05 f4 01 20 00 00 00 11 12 ......................(共500字节) -------串口收到的数据包
typedef struct
{
uint8_t cmd; // unsigned char
uint16_t len;
uint8_t data[0];
}beken_ota_pkt;
假设我们串口收到如上一帧数据,但是我们想要转换成如上结构体去处理,此时函数如下,当我们强制转换的时候整包数据会按照我们结构体所定义的字节长度一一赋值,结构体里我们定义cmd:u8(1字节),得到1字节数据05,结构体定义len:u16(2字节),得到2字节:F4 01,至于F4,01这两个字节高位在前还是低位在前则由发送时自己决定,如果串口发过来是低位在前,则01 F4 = 500;同理,获取4个字节的data数据即是addr,data右移4则是我们的实际数据。
void ota_send_handler(uint8_t *pbuff, uint16_t len) //这里len我们用不到
{
beken_ota_pkt_s* beken_ota_pkt = (beken_ota_pkt_s*)pbuff;
}
四、强制转换之 struct-----> u8
存储时一般变量定义在一个结构体里,要存入IIC时直接强转成(unsigned char*)类型,此时会自动将整个结构体按照1字节铺开,如果结构体有个u16 len:500,则存入时变为F4 01 低位在前(小端存储方式)。