字节顺序的详细解释(转)

原出处:http://blog.csdn.net/yingfox/article/details/1831848

一、基本概念

位的概念:在计算机中,一个0或1称为一位(bit)。

字节:连续的八位称为一个字节(Byte),字节是计算机中可单独处理的最小单位。即以字节
为基本单位来解释信息,规定1个字节是8个二进制位。

通常1个ASCII码用1个字节存放,1个汉字用2个字节存放,双精度浮点实数用8个字节存放。
下面列表C语言中定义类型所占字节以及数据范围。

类型标识符         类型说明    长度(字节)  范围                       备注

char               字符型           1      -128 ~ 127                -2^7~(2^7-1) 
unsigned char      无符字符型       1      0 ~ 255                    0~(2^8-1) 
short int          短整型           2      -32768 ~ 32767           -2^15~(2^15-1) 
unsigned short int 无符短整型       2      0 ~ 65535                  0~(2^16-1) 
int                整型             4      -2147483648 ~ 2147483647 -2^31~(2^31-1) 
unsigned int       无符整型         4      0 ~ 4294967295             0~(2^32-1) 
float              实型(单精度)   4      1.18*10-38 ~ 3.40*1038     7位有效位 
double             实型(双精度)   8      2.23*10-308 ~ 1.79*10308   15位有效位 
long double        实型(长双精度) 10     3.37*10-4932 ~ 1.18*104932 19位有效位

二、字节顺序由来

我们在写字符流时,因为字符型只占一个字节数,计算机只须按一个字符一个字符
写入文件即可。但是如果是处理整型时,由于整型占4个字节,所以一个整型内部的
字节存储排列的顺序直接关系到被计算机识别出来的整型值。某种意义上也可直接
理解计算机的识别顺序就是所谓的字节顺序。

三、一些有关字节顺序的解释

不同的计算机结构有时使用不同的字节顺序存储数据。例如,基于Intel的计算机存储数据
的顺序与Macintosh(Motorola)计算机就是相反的。Intel字节顺序称为“Little-Endian”,
反之Macintosh(Motorola),还有网络上采用标准是“Big-Endian”。在将应用程序从一种架
构类型迁移至另一种架构类型的过程中,经常会遇到字节排列顺序(endianness)问题。
字节排列顺序是数据元素及其单个字节在内存中存储和表示时的顺序。

通过以上分析,会发现有两类字节排列顺序:big-endian (通常为网络字节顺序)和
little-endian(主机字节顺序)。

下面是这些术语的废话解释。

Big-Endian        最重要的字节在整个内容的左端。  
Little-Endian     最重要的字节在整个内容的右端。  
对于big-endian处理器,在将字放在内存中时,是从最低位地址开始的,首先放入最重要的
字节。另一方面,对于little-endian处理器,如Intel处理器,首先放入的是最不重要的字
节。

说完上面的概念还是很模糊,个人认为对于不了解的字节顺序的人绝对是废话,网上大多都
是照搬照抄这几段废话。具体我们通过实际例子说明。

四、这里的解释说明

我们先看下面的代码,看完啥都明白了。
  
  这是运行在HP-UNIX 9000/800下完整的C语言代码,即为 Big-Endian 方式。

 1 #include <unistd.h>
 2   void main()
 3   {
 4
 5   int i=0x41424344;
 6
 7   printf("int  Address:%x Value:%x/n",&i,i);
 8   printf("-------------------------------/n");
 9
10   char* pAddress=(char*)&i;
11   int j;
12
13   for(j=0;j<=3;j++)
14   {
15    printf("char Address:%x Value:%c/n",pAddress,*pAddress);
16    pAddress++;
17   }
18
19   }

编译输出(cc -g ...):

  int  Address:7f7f08f0 Value:41424344
  -------------------------------
  char Address:7f7f08f0 Value:A
  char Address:7f7f08f1 Value:B
  char Address:7f7f08f2 Value:C
  char Address:7f7f08f3 Value:D

我们回到Windows XP下,看看这段代码的输出。Little-Endian 模式。

 1   #include <stdio.h>
 2   void main()
 3   {
 4    int i=0x41424344;
 5    printf("int  Address:%x Value:%x/n",&i,i);
 6    printf("-------------------------------/n");
 7    char* pAddress=(char*)&i;
 8    int j;
 9    for(j=0;j<=3;j++)
10    {
11     printf("char Address:%x Value:%c/n",pAddress,*pAddress);
12     pAddress++;
13    }
14   }

编译输出(VC 6.0):

  int  Address:12ff7c Value:41424344
  -------------------------------
  char Address:12ff7c Value:D
  char Address:12ff7d Value:C
  char Address:12ff7e Value:B
  char Address:12ff7f Value:A

看完上面代码,应该就很清楚了,什么字节顺序?真是简单的要死!int i=0x41424344;
    采用16进制,我们知道A的ACSII码是65,16进制就是41,可以理解,本例是想通过输出
    A,B,C,D来验证字节顺序。我再对内存数据进行列表,相信会更有深层次的理解。

Big-Endian的内存放置顺序如下:
  
  地址:0x7f7f08f0  0x7f7f08f1  0x7f7f08f2  0x7f7f08f3
  
        0x41        0x42        0x43        0x44
      
  Little-Endian的内存放置顺序如下:

地址:0x0012ff7c  0x0012ff7d  0x0012ff7e  0x0012ff7f
  
        0x44        0x43        0x42        0x41

五、最后的说明

主机字节顺序(Host)
  Little-Endian [ Intel、VAX和Unisys处理器 等]
  网络字节顺序(Network)
  Big-Endian [ IBM 370、Motorola和大多数RISC设计 ---- IBM 大型机和大多数Unix平台 ]

字节转换多半应用在网络编程,或者代码移植的情况下。
  Unix环境下的一些相关函数:(必须包含头文件 #include <netinet/in.h>)
  
  htons()--"Host to Network Short"
  htonl()--"Host to Network Long"
  ntohs()--"Network to Host Short"
  ntohl()--"Network to Host Long"
  
  Windows .Net 一些相关函数:
  
  HostToNetworkOrder
  NetworkToHostOrder

时间: 2024-12-17 10:22:54

字节顺序的详细解释(转)的相关文章

姿势体系结构的详细解释 -- C

我基本上总结出以下4部分: 1.问题的足迹大小. 2.字节对齐问题. 3.特别保留位0. 4.这种结构被存储在存储器中的位置. #include <stdio.h> #include <stdlib.h> #include <string.h> //基本概念 /* struct _M { (1) 类型 參数名 : 占位大小. (2) 类型 : 占位大小: } (1) 类型 -- int,unsigned(32位),short,char. 參数名 -- 同个结构体里面不能

mysql status 详细解释

状态名 作用域 详细解释 Aborted_clients Global 由于客户端没有正确关闭连接导致客户端终止而中断的连接数 Aborted_connects Global 试图连接到MySQL服务器而失败的连接数 Binlog_cache_disk_use Global 使用临时二进制日志缓存但超过binlog_cache_size值并使用临时文件来保存事务中的语句的事务数量 Binlog_cache_use Global 使用临时二进制日志缓存的事务数量 Bytes_received Bo

字节顺序标记——BOM,Byte Order Mark

定义 BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码. 介绍 UTF-8 不需要 BOM,尽管 Unicode 标准允许在 UTF-8 中使用 BOM.但不含 BOM 的 UTF-8 才是标准形式,在 UTF-8 文件中放置 BOM 主要是微软的习惯(顺便提一下:把带有 BOM 的小端序 UTF-16 称作「Unicode」而又不详细说明,这也是微软的习惯). 「UTF-8」和「带 BOM 的 UTF-8」的区

我对CONTAINING_RECORD宏的详细解释

宏CONTAINING_RECORD的用处其实还是相当大的, 而且很是方便, 它的主要作用是: 根据结构体中的某成员的指针来推算出该结构体的指针! 下面从一个简单的例子开始说起: 我们定义一个结构体, 同时类型化: typedef struct{ int a; int b; int c; }ss; 这是一个很简单的结构体, 没什么特殊的, 稍微分析下该结构体: 结构体的大小(字节):4+4+4=12字节 成员a的偏移:0 成员b的偏移:4 成员c的偏移:8 我们用ss来定义一个变量: ss s

Atitit&#160;.jvm&#160;虚拟机指令详细解释

Atitit .jvm 虚拟机指令详细解释 1. 一.未归类系列A1 2. 数据mov系列2 2.1. 二.const系列2 2.2. 三.push系列2 2.3. ldc系列 该系列命令负责把数值常量或String常量值从常量池中推送至栈顶.3 2.4. 5.1.load系列A 该系列命令负责把本地变量的送到栈顶.3 2.5. 5.2.load系列B 该系列命令负责把数组的某项送到栈顶.4 2.6. 6.1.store系列A 该系列命令负责把栈顶的值存入本地变量.5 2.7. 6.2.stor

C语言 - 结构体(struct)比特字段(:) 详细解释

结构体(struct)比特字段(:) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26722511 结构体(struct)能够使用位字段(:), 节省空间, 例如以下面代码, 结构体a中的, 第一个变量x占用1个字符, y占用2个字符, z占用33个字符(越界); 可是sizeof()会自己主动补齐, 如x+y一共占用4个字节, z占用8个字节, 所以结构体占用12个字节; 当使用加法运算时, 会初始化为0; 代码

445port入侵详细解释

445port入侵详细解释   大约"445port入侵"内容445port入侵详细解释网站搜索许多其他的"445port入侵"内容 445port入侵,以前我们先来看看或445port早干嘛去了,成为侵入port呢?445port就是IPC 服务的默认port                                                            ipc$一 摘要 二 什么是 ipc$ 三 什么是空会话 四 空会话能够做什么 五 ip

详细解释 使用FileReference类加载和保存本地文件

一般而言,用户不希望web浏览器中运行的应用程序访问电脑硬盘里的文件.然而,随着基于浏览器(browser-based)的富因特网应用程序的增多,一些应用程序迫切需要访问用户所选择的文件,或者将文件保存到用户所选择的位置.支持FileReference类的Adobe Flash Player版本允许ActionScript应用程序将用户所选择的文件上传到服务器,或者从服务器下载文件到用户所选择的位置.然而,在Flash Player 10之前的版本中,除非您先将数据传送到服务器,否则无法在应用程

【网络编程系列】一:字节顺序的大端与小端表示法

一.字节序 字节序,也就是字节的顺序,指的是多字节的数据在内存中的存放顺序. 在几乎所有的机器上,多字节对象都被存储为连续的字节序列.例如:如果C/C++中的一个int型变量 a 的起始地址是&a = 0x100,那么 a 的四个字节将被存储在存储器的0x100, 0x101,0x102, 0x103位置. 根据整数 a 在连续的 4 byte 内存中的存储顺序,字节序被分为大端序(Big Endian) 与 小端序(Little Endian)两类. 然后就牵涉出两大CPU派系: Motoro