理解字节序:大端模式、小端模式

来源:互联网 发布:win8.1配置java环境 编辑:程序博客网 时间:2024/05/19 22:56

一、字节序

     字节序是什么,看书是一点用也没有的,看不明白到底是为什么。

     我始终坚持一个观点:实践是检验真理的唯一标准。

     下面,就是我的实践过程。使用C/C++语言。

(1)内存地址,最小单位是字节。仅仅看单次的内存分配,都是首地址的数值最小,后续的不断增长。

(2)单个字节 = 8位,例如:11110000

(3)考虑占4个字节的int型,要怎么表达?因为需要4个字节: [ 1号 ][ 2号 ][ 3号 ][ 4号 ]

此时,问题来了,就是例如 int x = 0x12345678,

这种4个字节的数,12,34,56,78,这4个字节要怎么排序?

假设左边是int x的首地址

如果这么排序: [12] [34] [56] [78] ,就是大端模式。

如果这么排序: [78] [56] [34] [12] ,就是小端模式。


(4)下面,用VS2013作为工具,进行调试。(windows系统,默认是小端模式)

代码如下图1所示:


图1


从图1中,可以明显的看到一件事情。就是分配内存的时候,首地址的数值是最小的,分配的时候依次增大,内存地址的单位是字节。VS2013的调试模式,以16进制显示内存地址。

很明显 x 的地址是:0x00CFFF18

数字78的地址:0x00CFFF18

数字56的地址:0x00CFFF19

数字34的地址:0x00CFFF1A

数字12的地址:0x00CFFF1B



到这里,我想大家应该都明白了,内存地址的值的分配是从小到大增长的。也明白了什么是大端,什么是小端。


二、再给一例子

       如下图2所示。


图2


理解的关键点:  

1.理解内存地址是一个数值

2.内存地址的最小单位是:字节

3.内存地址的分配,是从小到大增长的

4.16进制数字和字节的对应关系:

例如 0x12 是一个字节, 0x36AD是两个字节, 0xABCD1234是四个字节。

因为 (一个字节) = (8位)=(0~255),而( 0x00~0xFF) = ( 0~255)



三、写一个函数,区分大端和小端

要求:如果是小端就返回1,是大端就返回0

int check(void)  {      union      {          int a;          char b;      }c;      c.a = 1;      return (c.b == 1);  }  


应该很好理解!




==================================

0 0