教师网站建设机培训体会免费下载,wordpress+支付宝+微信,外贸网站分析,公司官网源码下载大端模式 所谓的大端模式#xff0c;是指数据的高位#xff0c;保存在内存的低地址中#xff0c;而数据的低位#xff0c;保存在内存的高地址中#xff0c;这样的存储模式有点儿类似于把数据当作字符串顺序处理#xff1a;地址由小向大增加#xff0c;而数据从高位往低位… 大端模式
所谓的大端模式是指数据的高位保存在内存的低地址中而数据的低位保存在内存的高地址中这样的存储模式有点儿类似于把数据当作字符串顺序处理地址由小向大增加而数据从高位往低位放例子0000430: e684 6c4e 0100 1800 53ef 0100 0100 00000000440: b484 6c4e 004e ed00 0000 0000 0100 0000在大端模式下前16位应该这样读: e684记忆方法: 地址的增长顺序与值的增长顺序相同小端模式
所谓的小端模式是指数据的高位保存在内存的高地址中而数 据的低位保存在内存的低地址中这种存储模式将地址的高低和数据位权有效地结合起来高地址部分权值高低地址部分权值低和我们的逻辑方法一致。例子0000430: e684 6c4e 0100 1800 53ef 0100 0100 00000000440: b484 6c4e 004e ed00 0000 0000 0100 0000在小端模式下前16位应该这样读: 84e6记忆方法: 地址的增长顺序与值的增长顺序相反大小端模式
为什么会有大小端模式之分呢这是因为在计算机系统中我们是以字节为单位的每个地址单元都对应着一个字节一个字节为 8bit。但是在C语言中除了8bit的char之外还有16bit的short型32bit的long型要看具体的编译器另外对于位数大于 8位的处理器例如16位或者32位的处理器由于寄存器宽度大于一个字节那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x在内存中的地址为0x0010x的值为0x1122那么0x11为高字节0x22为低字节。对于 大端模式就将0x11放在低地址中即0x0010中0x22放在高地址中即0x0011中。小端模式刚好相反。我们常用的X86结构是小端模式而KEIL C51则为大端模式。很多的ARMDSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。下面两个例子只有一个是可以正确输出的。如下
例一 #include stdio.h
#include stdlib.h
#include string.hint main(void)
{ char a[20];int i;int *pa;for(i0;i20;i){a[i]i;printf(a[%d]%d\n,i,a[i]);}//p;printf(%d\n,*p);printf(P0x%X\n,p);printf(a0x%X a0x%X\n,a,a);printf(a[0]0x%X\n,a[0]);
}
重点讲一下第一个例子
首先要知道存储的大小端问题
大端模式是指数据的高位保存在内存的低地址中而数据的低位保存在内存的高地址中
小端模式是指数据的高位保存在内存的高地址中而数 据的低位保存在内存的低地址中 int main(void)
{//大端模式是指数据的高位保存在内存的低地址中而数据的低位保存在内存的高地址中//小端模式是指数据的高位保存在内存的高地址中而数 据的低位保存在内存的低地址中char x1,x0;int x0x1122; x0((char*)x)[0]; //低地址单元 如果等于0X22就说明是小端模式 如果等于0X11就说明是大端模式 0x11是高位数据 0x22是低位数据x1((char*)x)[1]; //高地址单元 printf(x0%x x1%x\n,x0,x1);if(0x22x0){printf(计算机是小端模式\n);}else{printf(计算机是大端模式\n); }
}最后得出是小端模式也就 是数据的
低
位数据保存在
低
地址中 一般情况就我以前的编程经验小端模式的计算机比较多 好了现在知道是小端模式了那么。再看回上面的代码。
a数组从0~19 依次是a[0]~a[19]的值是0~19.
那么我p的地址和a的地址是一样的p指向a数组的首元素。而且p是指向int类型a是char类型。那么*p应该是从a[0]到a[3]4个元素。p会取得这四个元素的值。
又因为是小端模式高位数据在高地址低位数据在低地址原来3是在高位数据肯定回到高位地址也就是0X30201000。这四个字节取出来的值应该是00000011 00000010 00000001 00000000 也就是 3210 转成int就是50462976 好了。从上面的例子来看我很快得出一个想法看下面的代码 #include stdio.h
#include stdlib.h
#include string.hint main(void)
{ char a[20];char b0;int i;int *p;pa;for(i0;i20;i){a[i]i;printf(a[%d]%d\n,i,a[i]);}//p;printf(%X\n,*p);printf(P0x%X\n,p);printf(b%x b%d\n,b,b);printf(a0x%X a0x%X\n,a,a);printf(a[0]0x%X\n,a[0]);
}例二 #include stdio.h
#include stdlib.h
#include string.hint main(void)
{ char a[20];int i;char *pa;for(i0;i20;i){a[i]i;printf(a[%d]%d\n,i,a[i]);}//p;printf(%d\n,*p);printf(P0x%X\n,p);printf(a0x%X a0x%X\n,a,a);printf(a[0]0x%X\n,a[0]);
}