大端模式和小端模式

2015/07/28 C和C++基础

大小端定义

1,大端模式:内存的低位存数据的高位,内存的高地址存数据的低位。

2,小端模式:内存的低地址存数据的低位,内存的高地址存数据的高位。

例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

而在Big-endian模式CPU内存中的存放方式则为:

32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

而在Big-endian模式CPU内存中的存放方式则为:

编程判断大小端:

#include <iostream>
using namespace std;

int main(){
	int a = 0x12345678;
	char *p = (char *)(&a);
	if(*p == 0x78){
		printf("xiao duan!\n");
	}else if(*p == 0x12){
		printf("da duan!\n");
	}else{
		printf("other!\n");
	}
	system("pause");
}

大小端和共用体

1、请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1。

int checkCPU()
{ 
   union w{       //变量a的起始地址和变量b的起始地址是相同的
       int a;
       char b;
   }c;

   c.a = 1;
   return(c.b ==1);
}

2、求下面代码输出结果:

#include <stdio.h>
#include <stdlib.h>

union Un{
	int a;
	char c[3];
};

int main(){
	Un A;
	A.c[0]=2;
	A.c[1]=13;
	A.c[2]=255;
    //共用体变量的地址和它的各成员的地址都是同一地址
	printf("%d  %0x\n",A.a,A.a);  
	system("pause");
}

程序解析:

a: 02  0d  ff  随机值
c: 02  0d  ff

如果以小端去解析a 随机值  ff  0d  02
如果以大端去解析a:  02     0d  ff  随机值

3、求下面代码输出结果:

#include <stdio.h>
#include <stdlib.h>

union Un{
	int a;
	int b[3];
};

int main(){
	Un A;
	A.b[0]=0;
	A.b[1]=0;
	A.b[2]=0;
	A.a=6;
    //共用体变量的地址和它的各成员的地址都是同一地址
	printf("%d  %d  %d\n",A.b[0],A.b[1],A.b[2]);
	system("pause");
}

程序解析:

由于机器是小端格式
a: 06  00  00  00
b: 06  00  00

所以a[0]=6  a[1]=0  a[2]=0

4、求下面代码输出结果:

#include <stdio.h>
union{
	int i;
	char x[2];
}a;

int main(){
	a.x[0]=10;
	a.x[1]=1;
	printf("%d",a.i);
}

设机器为小端格式

程序解析:

x:  0A  01 
a:  0A  01  00  00

以小端格式解析a,则a=0x0000010A 
也就是a=266

5、求下面代码输出结果:

int main(){
	union{          //定义一个联合体
		int i;
		struct{     //在联合体中定义一个结构体
			char first;
			char second;
		}half;
	}number;
	number.i=0x4241;
	printf("%c%c\n",number.half.first,number.half.second);  //A、B
	number.half.first='a';
	number.half.second='b';
	printf("%x\n",number.i);   //6261
	system("pause");
}

Search

    Post Directory