大端模式
小端模式
大小端模式
下面两个例子,只有一个是可以正确输出的。如下:
例一:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char a[20]; int i; int *p=a; for(i=0;i<20;i++) { a[i]=i; printf("a[%d]=%d\n",i,a[i]); } //p++; printf("%d\n",*p); printf("&P=0x%X\n",p); printf("a=0x%X &a=0x%X\n",a,&a); printf("&a[0]=0x%X\n",&a[0]); }
重点讲一下第一个例子:
首先要知道存储的大小端问题:
大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中
小端模式,是指数据的高位保存在内存的高地址中,而数 据的低位保存在内存的低地址中
int main(void) { //大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中 //小端模式,是指数据的高位保存在内存的高地址中,而数 据的低位保存在内存的低地址中 char x1,x0; int x=0x1122; x0=((char*)&x)[0]; //低地址单元 如果等于0X22就说明是小端模式 如果等于0X11就说明是大端模式 0x11是高位数据 0x22是低位数据 x1=((char*)&x)[1]; //高地址单元 printf("x0=%x x1=%x\n",x0,x1); if(0x22==x0) { 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.h> int main(void) { char a[20]; char b='0'; int i; int *p; p=a; for(i=0;i<20;i++) { a[i]=i; printf("a[%d]=%d\n",i,a[i]); } //p++; printf("%X\n",*p); printf("&P=0x%X\n",p); printf("b=%x b=%d\n",b,b); printf("a=0x%X &a=0x%X\n",a,&a); printf("&a[0]=0x%X\n",&a[0]); }
例二:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char a[20]; int i; char *p=a; for(i=0;i<20;i++) { a[i]=i; printf("a[%d]=%d\n",i,a[i]); } //p++; printf("%d\n",*p); printf("&P=0x%X\n",p); printf("a=0x%X &a=0x%X\n",a,&a); printf("&a[0]=0x%X\n",&a[0]); }