计算机系统是以字节为单位进行存储的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C/C++语言中除了8bit的char类型之外,还有int、long、float、double等多字节的内置数据类型,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。KEIL C51则为大端模式。X86、很多的ARM,DSP都为小端模式。
大端模式,是指数据的高字节保存在内存的低地址中。小端模式,是指数据的高字节保存在内存的高地址中。以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况。
我们可以通过C语音程序来测试 计算机的大小端形式。
方法一: 使用union
#include "stdio.h"
union w
{
int a; //4 bytes
char b; //1 byte
} c;
int main()
{
c.a=1;
if (c.b==1)
printf("It is Little_endian!\n");
else
printf("It is Big_endian!\n");
return 1;
}
方法二:使用 强制类型转换
int main()
{
unsigned int a = 0x12345678;
unsigned char b = (unsigned char) a ;
if (b==0x78)
printf("It is Little_endian!\n");
else
printf("It is Big_endian!\n");
return 1;
}
C/C++ 内置数据类型 的字节长度如下表所示,在不同bit的计算机上 指针/long类型的长度会有所区别,可以通过sizeof()函数来查看。
| 16 bit 编译器 | 32 bit 机器 | 64bit 机器 |
bool (C没有bool类型,C++ 有) |
| 1 | 1 |
char / unsigned char | 1 byte | 1 | 1 |
char * / int * … /各种指针类型 | 2 | 4 | 8 |
short | 2 | 2 | 2 |
int/ unsigned int | 2 | 4 | 4 |
float | 4 | 4 | 4 |
double | 8 | 8 | 8 |
long / unsigned long | 4 | 4 | 8 |
long long | 8 | 8 | 8 |