今天一个读者朋友给我发的一段代码,这段代码让他有了疑惑。
代码如下:
#include "stdio.h"
int main()
{typedef union{short i;char j[2];}DATA;DATA a;a.j[0] = 10;a.j[1] = 1;printf("%x\n",a.i);return 0;
}
他的几个测试代码以及输出
这里说一个问题,我们从printf上看到的不一定我们想看到的,所以我们需要去变量的内存地址一探究竟,一定要了解内存的布局,对内存有所了解。
上面注释的代码,在我的电脑中运行的结果不相同,所以要看printf的准确输出,应该初始化变量a
。
使用gdb来查看地址,可以准确看到变量内存中的数据。
什么是大小端?
这个问题在之前的文章说过,这里再重新提一下
大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中
小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中
我们用这个再来看看我们的程序
#include "stdio.h"
int main()
{typedef union{short i;char j[2];}DATA;DATA a;//a.j[0] = 10;a.j[1] = 1;printf("%x\n",a.i);return 0;
}
j[0]
在低地址,j[1]
在高地址,这个没有什么意见吧?
内存就是一个尺子????,它是不断变长的,所以这个地址也是慢慢变大的,没有任何问题吧。
然后,我们可以看看现在的输出,从上面的输出可以看到输出100
,也就是j[1]
在高地址,j[0]
在低地址,那这个计算机就是小端模式
。
也可以通过查看内存地址来确认
相关文章
计算机验证大小端
推荐阅读:
专辑|Linux文章汇总
专辑|程序人生
专辑|C语言
我的知识小密圈
关注公众号,后台回复「1024」获取学习资料网盘链接。
欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~
嵌入式Linux
微信扫描二维码,关注我的公众号