目标
将4字节大小变量拆开查看各自内容,弄清4字节数据存放顺序。
代码及测试
unsigned int temp=0x01ff02fe;
printf("%d\n", &temp);
unsigned int address;
scanf_s("%d", &address);
printf("%d\n", *((unsigned char *)address));
分析
相比于之前的文章(C语言--输入地址,输出该地址内容),修改了temp值以及最后一行地址的类型,如果是(unsigned int *)address,则*((unsigned int *)address)表示的是,address开始后面4个字节的数据(即address~address+3所代表的的数据);如果是(unsigned char*)address,则*((unsigned char *)address)表示的是,address开始,后面1个字节的数据(即address所代表的数据)。
比如temp的地址是15530824,如果将这个地址赋给address,则输出的是address这个地址的数据;如果输入的是15530825,则输出的是2;如果输入15530825,则输出255;如果输入15530826,则输出1。
与认知相反,在内存中应该是这样存放的:
可以推测,如果temp=1,内存中应该是这样存放:
这就表明,对于多个字节的变量来说,先将低内存地址的空间存满,再填充高内存地址的空间。
直接分别输出四字节内容
unsigned int temp = 0x01ff02fe;
printf("%d\n", &temp);
unsigned int address=(unsigned int)(&temp);
for (int i = 0; i < 4; i++)
{
printf("address+%d: %d\n", i,*((unsigned char *)address++));
}
后记
为什么想要探究这个问题呢?
因为在项目中写串口程序时出现了一个问题:
这些数据存在一个结构体中,该结构体设置一个字节对齐,毫无疑问这些变量从前到后都是占用连续的字节空间,中间没有空余的空间。
其中帧头m_head类型为unsigned char,地址m_address类型为unsigned short。
发送数据时,是将该结构体所占用的连续内存空间数据使用memcpy原封不动复制到char []数组中,再进行发送。
疑惑的是,m_address设置的是0xeeff,但实际上接收到的是ffee,前后字节颠倒过来了。
于是便有了该文章的探究。