今天一个读者朋友给我发的一段代码,这段代码让他有了疑惑。
代码如下:
#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
”,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
”,a.i);
return 0;
}
j[0]在低地址,j[1]在高地址,这个没有什么意见吧?
内存就是一个尺子,它是不断变长的,所以这个地址也是慢慢变大的,没有任何问题吧。
然后,我们可以看看现在的输出,从上面的输出可以看到输出100,也就是j[1]在高地址,j[0]在低地址,那这个计算机就是小端模式。
也可以通过查看内存地址来确认
中国未来5-10年光纤需求量巨大,注重竞争力优先
SNP一秒解答SAP云迁移的四种部署模式
pwru的使用方法、经典场景及实现原理
中国物联网芯片变得强大了?
超声波塑料焊接工艺在纺织行业的应用
如何使用union来了解内存?
谈中国重化工业发展的环境问题分析与对策研究
宝马推出新app 使用次数越多越善解人意
基于SG3525的220V逆变器用直流升压电路的设计与特性分析
英特尔8代酷睿处理器亮相 采用14nm工艺性能提升15%
这四个国家看清局势_华为的翻盘机会来了
LG手机王者归来,1.08亿+高通骁龙865+5500mAh
联想新品Z6 Pro发布 后置四摄全程DC调光
变频器可靠运行这四大要素不可少
中兴通讯已率先发布了5G端到端切片方案
2021年中国连接器市场现状及发展趋势
4G DTU为什么要具有透传的功能,它有哪些优势
宝安明年8月底前将累计完成建设8000个,实现5G网络全覆盖
EPM7128在TMS320LF2407A系统中电平转换的应用
电机启动有调速器要加电容吗?