计算机中的大小端模式及C语言中如何鉴别他们

我的博客:www.while0.com

参考http://blog.csdn.net/ce123_zhouwei/article/details/6971544  写的很详细。

大小端主要是对数字类型来说的,字符串不存在大小端问题,字符串是从低地址到高地址顺序排列的。

1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

在我们的X86系列中,主要是使用的小端(Little-Endian)模式,在网络协议及其他有些地方是用的大端模式。

注意:在寄存器中是大端模式

他们各自的优点:

Big-Endian优点:靠首先提取高位字 节,你总是可以由看看在偏移位置为0的字节来确定这个数字是 正数还是负数。你不必知道这个数值有多长,或者你也不必过一些字节来看这个数值是否含有符号位。这个数值是以它们被打印出来的顺序存放的,所以从二进制到 十进制的函数特别有效。因而,对于不同要求的机器,在设计存取方式时就会不同。

Little-Endian优点:提取一个,两个,四个或者更长字节数据的汇编指令以与其他所有格式相同的方式进行:首先在偏移地址为0的地方提取最低位的字节,因为地址偏移和字节数是一对一的关系,多重精度的数学函数就相对地容易写了。

如果你增加数字的值,你可能在左边增加数字(高位非指数函数需要更多的数字)。 因此, 经常需要增加两位数字并移动存储器里所有Big-endian顺序的数字,把所有数向右移,这会增加计算机的工作量。不过,使用Little- Endian的存储器中不重要的字节可以存在它原来的位置,新的数可以存在它的右边的高位地址里。这就意味着计算机中的某些计算可以变得更加简单和快速。

 

以下程序以两种方法来判断计算机是大端模式还是小端模式:

首先是使用强制类型转换来判断,其次是用共用体来判断。

强制类型转换的时候,如果是小端模式,则int a=0x4142,在内存里边的表示如下

首先要给a的高位补0,补到足够4字节,即a=0x00004142,则在小端模式中,高位在高地址

低地址-------------->高地址

42  41  00  00

低位----------------->高位

强制转换成char类型,丢弃高位,保留最低的一位,所以char b= 0x42,所以如果成功打印出字符B,则说明是小端模式,否则是大端模式。

共用体也是同理。

 

 

 

你可能感兴趣的:(C语言)