程序存储模式分为大端模式和小端模式.
大端模式: 字数据的高字节存放在低地址中, 低字节存放在高地址中:
小端模式: 字数据的高字节存放在高地址中, 低字节存放在低地址中:
小编推荐一个学 C 语言 / C++ 的学习裙[ 六九九, 四七零, 五九六 ] , 无论你是大牛还是小白, 是想转行还是想入行都可以来了解一起进步一起学习! 裙内有开发工具, 很多干货和技术资料分享!
一个测试是大端模式还是小端模式的方法:
- #include
- #include
- int CheckSystem()
- {
- int *p=NULL;
- union check
- {
- int i;
- char ch;
- }c;
- c.i=1;
- return (c.ch == 1);
- }
- int main(void)
- {
- if(CheckSystem())
- printf("小端模式");
- else
- printf("大端模式");
- }
输出:
小编推荐一个学 C 语言 / C++ 的学习裙[ 六九九, 四七零, 五九六 ] , 无论你是大牛还是小白, 是想转行还是想入行都可以来了解一起进步一起学习! 裙内有开发工具, 很多干货和技术资料分享!
大端模式和小端模式主要在 MCU 编程是要考虑, 在进行 MCU 编程之前, 用上述程序测试一下.
一个奇怪的程序的理解: 小端存储
- #include
- #include
- int main(void)
- int a[5] = {1,2,3,4,5};{
- int *p1=(int*)(&a+1);
- int *p2=(int*)((int)a + 1);
- printf("%X %X %X %X",&a,&a+1,(int)a,(int)a+1);
- printf("%X %X",p1[-1],*p2);
- return 0;
- }
输出什么?
输出如下:
即:&a == 0x12ff34,(&a+1) == 0x12ff48,((int)a) == 0x12ff34,((int)a +1) == 0x12ff35;
p1 指向的是 0x12ff48 所代表的地址, 0x12ff48=0x12ff34+0x14
p2 指向的是 0x12ff35 所代表的地址.
&a 即表示 a[0]地址, a 中各元素地址:
- &a[0]==0x12ff34
- &a[1]==0x12ff38
- &a[2]==0x12ff3c
- &a[3]==0x12ff40;
- &a[4]==0x12ff44;
内存如下:
小编推荐一个学 C 语言 / C++ 的学习裙[ 六九九, 四七零, 五九六 ] , 无论你是大牛还是小白, 是想转行还是想入行都可以来了解一起进步一起学习! 裙内有开发工具, 很多干货和技术资料分享!
可以看出 p1 指向的实际是 a[4]的后面一个内存的地址
而 p1[-1]值为 5, 为 a[4], 所以 p1[-1]等价于 p1-1. 由于 p1 指向 0x12ff48, 所以 p1-1 指向 0x12ff44, 也就是 a[4]的地址,
所以 p1[-1]为 5, 同理可推断出 p1[-2]值为 4,p1[-3]值为 3,p1[-4]值为 2,p1[-5]值为 1
再看 p2 指向的地址为 0x12ff35, 也就是上图中 01 后面的那个 00 所占有的地址, 那么 * p2 指向一个整型值, 应该是地址 0x12ff35~0x12ff38 内的值, 为 2000000
同理可推断, 若 int *p2=(int*)((int)a+2); 则 * p2=20000; 若 int *p2=(int*)((int)a+3); 则 * p2=200; 若 int *p2=(int*)((int)a+4); 则 * p2=2;
来源: http://www.jianshu.com/p/17bc9e3293c0