《Fortran90程序设计.ppt》由会员分享,可在线阅读,更多相关《Fortran90程序设计.ppt(68页珍藏版)》请在课桌文档上搜索。
1、Fortran 90 程序设计,编译器简介,4 程序单元概念,1Fortran语言的发展,2源程序及其构成,3 语言元素,作用:把高级语言翻译成机器码,也就是常常可以看到扩展名为EXE、COM的文件。相同的程序代码可用不同厂商的编译器来编译,所生成的文件也不会完全相同。编译器的好坏主要取决于编译结果。,1.1 编译器简介,第一章FORTRAN语言的发展简史,2.1 Fortran语言的发展简史,一、FORTRAN 含义及其适用范围 FORmula TRANslator 公式翻译器 科学和工程计算问题的程序设计语言,二、发展简史 代表性:1957,1958 FORTRAN,1962 FORTRA
2、N,1978 FORTRAN77,1991.FORTRAN 901997.FORTRAN95,FORRAN95不象FORTRAN90在FORTRAN77添加很多内容,只能视为90的修正版,加强了并行运算方面的支持,2.2 FORTRA90源程序基本结构,例:见书P15页例题2-12-22-3。1、由若干个程序单元(位)组成:主程序、外部子程序、模块、块数据单元2、主程序结构 program 程序名称一般省略 声明语句部分 执行语句部分 ENDprogram 程序名称3、END,停止运行结束标记,书写格式,Fortran程序代码的编写格式有两种:Free Format(自由格式)扩展名:.F90
3、 建议所有程序全部改用自由格式来编程 Fixed Format(固定格式)本教材不采用 扩展名:.F或.FOR,书写格式,Fixed Format(固定格式),书写格式,1.C FIXED FORMAT DEMO PROGRAM MAIN WRITE(*,*)HELLO WRITE(*,*)1HELLO100 WRITE(*,*)HELLO10 STOP END 程序代码命令之间的空格,不会有任何意义。FIXED FORMAT是为了配合早期使用穿孔卡片输入程序所发明的格式。,Free Format(自由格式)基本上允许非常自由的编写格式,它没有规定每一行的第几个字符有什么作用,但要注意:1.!
4、感叹号后面的文本都是注释。2.每行可以编写132个字符。3.行号放在每行程序的最前面。4.一行程序代码的最后如果是符号&,代表下一行程序会和这一行连接。如果一行程序代码的开头是符号&,代表它会和上一行程序连接。5.程序命令之间的空格,无意义。,书写格式,书写格式,1.!Free Format2.program main3.write(*,*)”Hello”!这也是注释4.write(*,*)&5.”Hello”6.wri&7.&te(*,*)”Hello”8.end 如果把Fortran的关键字分为两行书写,则两行都要加续行符号。如6、7行。,注释语句:!后的所有字符都被编译器忽略(非语句行)
5、可独占一行,可在其它语句之后,空行为注释行(固定格式用C和*),语句行:可执行语句:输入、赋值、输出 说明语句:用于说明变量的类型、属性等,注意:,行的书写(行的长度、分行、续行)一行可以是0132个字符,空格有意义,语句最长不超过2640个字符 一行可以有多个语句,用“;”分隔 一个语句可分行写,读行标记为&(放在尾部),但如为关键字,首尾均加&。最多可有511个续行。例 pro&gram main,书写格式,空格:关键字、变量、常量内部不能用空格,但相邻两者之间须用空格语句前标号仅用于标识一个语句,与运行顺序无关。语句有位置规定 说明语句必须出现在可执行语句之前,格式说明语句(FORMAT
6、语句)除外。,书写格式,2.3 语言元素,Fortran90的语言元素是指在程序设计中所用到的基本成分,例如字符集、常量、变量、记号以及其它的基本结构等。只有了解并掌握了这些基本要素,才可能正确自如地使用该种语言。,2.3.1 FORTRAN90字符集:编写Fortran90程序时,所能使用的所有字符及符号。AZ(az)程序中不区分大小写 26个 在大多数处理系统中允许使用小写字母,除了字符串内的字符外,小写字母等价于相应的大写字母。,09 10个 空格=+-*/(),:.$22个 _(下划线)、!、”、%、&、;、?注意:1、在FOR源程序中,只能使用以上字符 2、字符型数据内可以出现任意字
7、符(包括汉字)命名规则:131个字符,由字母、数字、下划线组成,第一个字符为字母 全局名:主程序单元、外部过程、数据块、模块,2.3.1 FORTRAN90字符集,在Fortran90中,将字母、数字或专用字符的基本有效的序列称为记号,它包括标号、关键字、名字、常数、运算符和定界符。例如:A*SIN(x)+5.3 这个表达式包括6个记号,即A、*、SIN、x、+、5.3。注意:在字符串内部,不能随意地添加空格。在记号内部,也不许随意地使用空格。记号与记号之间的空格可以随意地使用。多个空格在语法上与一个空格的作用相同。一个记号与相邻关键字、名字、常数或标号之间,应当用一个或多个空格分开,以避免错
8、误,同时也使结构清晰。,2.3.2 记号,常量的定义:常量是程序执行过程中不能变化的量。基本数据类型有五种:整型、实型、复型、字符型和逻辑型 前三种属于数值类型,后两种为非数值类型,主要用于文字处理和控制。,2.3.3基本类型常量,Fortran的数据类型,种别参数是由内在询问函数KIND送回的。提供的最小范围是由内在函数Selected_int_kind送回的。表示十进制幂的范围是由内在函数range送回的。缺省种别是指有符号或无符号的整数值。可在数值后用下划线标明种别,没有下划线为缺省种别。缺省种别整数的范围一般取决于所用计算机的字长。说明了种别参数后,提高了程序的可移植性。简而言之,种别
9、即决定数值在计算机中存储的字节数。,整型数据:微机支持3种kind_Value:1,2,4(1)范围:-128127(2)范围:-3276832767(4)-21474836482147483647(-231231-1)Integer 默认kind_Value的值为4,1.整型常量(INTEGER)整型常量又叫整数,整数值的集合就是数学整数的子集。,123_2&kind_Value常量也可如此指定,Fortran的数据类型,在FORTRAN90中,也可以表示二进制、八进制、十六进制形式的无符号整数。其形式如下:二进制数:B101101 或 B”101101”八进制数:O76210 十六进制数:
10、Z1FA2,Fortran的数据类型,2.实型常量(REAL)实型常量又叫实数,它具有数学实数的近似值。实数最常见的两种表示形式是:小数形式和指数形式 小数形式:由十个数字、小数点及数符组成的数。指数形式:对绝对值相对较小或很大的实数。规格化指数形式:(两种形式)1。数字部分的值小于1,且小数点后的第一位数字非0 2。数字部分有且仅有一位非零的整数。,Fortran的数据类型,一般分为两种 real(4)单精度(默认)real(8)双精度,小数形式:+/-m.n,+/-m.,+/-.n 例 100.0.5 5.注:小数点必须有。指数形式:数字部分E指数部分e 科学计数法 0.876=87610
11、-3 876E-3=87.6 10-2 87.6E-2=0.0876 10+1 0.0876E+1。数字部分,小数形式实数整数,Fortran的数据类型,指数部分:e只能为整数 错例:4E5.6 数字部分不能丢;例:10-4:E-4(错)1E-4(正确)以标准化形式输出(=1)实数:存储7位有效数字。如:2.300000 上溢:overflow 下溢:当0处理 4.实数种别为8时常量的表示(双精度数)有效位:15位;数字部分De 例:0D0,Fortran的数据类型,3.复数(COMPLEX)复型常数又叫复数。具有数学复数的近似值。在科学和工程计算中被广泛用到。复数是实数的有序对,将两个实数中
12、间用逗号分隔,然后再放在一对括号中就构成了一个复数。复数以a+bi的形式来表示数值,复数中的a、b称为实部和虚部。可为实数,也可为整数。Complex(4)(默认)例:Complex(4):b Complex(8)双精度 Complex(8):c,d,e 常量:符号(实部_kind_Value,虚部_kind_Value)例:f=(1,2.0_8),Fortran的数据类型,复型常量的表示:数学 2+3i,一般形式:(实部系数,虚部系数),错例:(1.0/2,3)正例:6i,(0,6)当复数的实部或虚部为变量或表达式进行赋值时,必须使用CMPLX()函数。,FORTRAN90(2,3),For
13、tran的数据类型,4.字符(CHARACTER)计算机除了存储数字之外,也可以在内存中记录一段文本,字符类型可以记录的东西非常广,从键盘输入的任何东西,不论是数字、文本或任何特殊符号,它都可以记录,只记录一个字母、符号时的数据类型称为“字符”,记录一连串的字符时,就称为“字符串”,记录一个西文字符需要一个字节的存储空间。一个汉字为两个字节的存储空间。kind 指明计算机系统支持的字符种类.字符常量:例:ASCII_”abcde”!kind值放在常量前面例:Character(LEN=10,kind=GREEK):Greek_word len=10可以直接写为10 或缺省长度为1;如只有一个没
14、有命名的参数,一定是长度整数,Fortran的数据类型,字符常量的表示:一串字符或“一串字符”(双引号),空格 算一个“算一个起止界不算长度可为0,字符中含改写为 abcd,长度:字符的个数,注:区分字符大小写 a A 空格有效 a b ab,Fortran的数据类型,5.逻辑判断(LOGICAL)逻辑判断只能保存两种逻辑结果,分别为“true”和“false”。LOGICAL(_kind_value)LOGICAL(1)LOGICAL(2)LOGICAL(4)(默认,值存储在第一个字节中)对数据的二进制最低位进行判断,如果为1,则接受为真,否则接受为假。,Fortran的数据类型,2.3.4
15、 名字,对于名字有下列要求:1.名字的长度不能超过31个字符 2.名字的组成成分可以是字母、数字和下划线 3.名字的第一个字符必须是字母 4.在名字中不能出现空格 提倡使用具有一定含义的名字,提高程序的清晰度和可读性。,1、定义:程序运行过程中值可变化的量2、命名的规则,字母、数字、下划线组成字母开头长度1-31个,错例 3A、x-3、3.14、A3$,2.3.5 变量,3、变量含义:实际是内存中的一个存储单元,存放变量的值。特性:取之不尽,一冲就跑,总采用当前值参与运算。例:A=2.0 A B B=3.0 A=A+B 5.0 15.0 B=A*B 注:A、B必须有确定值,如未定义,值不可预测
16、(有时按0处理),2.0,3.0,4、变量类型:基本类型有五种,同常量 I-N规则(隐式说明):在程序变量名中,凡以字母I、J、K、L、M、N六个字母开头的变量为整型变量。implizcit none 可以取消I-N规则。五种变量的类型说明关键字:整型:INTEGER 实型:REAL复型:COMPLEX 逻辑型:LOGICAL字符型:CHARACTER 待说明的变量放在后面,中间用双分隔符:隔开,对于同时说明多个变量,变量之间用逗号分隔。,Fortran90关于变量说明的新功能:1.在变量说明的同时,可以给变量赋初值。INTEGER:I=5,J=126 REAL:X=7.2,Z,W=774.2
17、 2.在说明变量的同时也可说明其种别 3.在说明变量的同时,还可说明变量的属性 INTEGER,PARAMETER:I=5,J=123 REAL,DIMENSION(1:10):A,2.3.6 派生数据类型,根据需要而由基本数据类型定义新的数据类型。在一个派生类型中可包含多个基本类型。如:TYPE STUDENT(定义开始)CHARACTER(LEN=20):DEPARTMENT CHARACTER(LEN=10):CLASS CHARACTER(LEN=15):NAME INTEGER:NUMBER(成员定义)END TYPE STUDENT(定义结束),派生类型变量的定义:TYPE(STU
18、DENT):PERSON变量的赋值:PERSON=(”COMPUTER”,”92_2”,”LI LIN”,21)成员的表示:PERSON%CLASS=“92_2”PERSON%NAME=“LI LIN”,2.3.7 基本类型数组,数组是具有相同类型的元素的有序集合。数组在使用之前必须说明。数组的说明:INTEGER,DIMENSION(1:50):X;数组名为X,类型为整型,元素个数为50。INTEGER,DIMENSION(5,3):B;数组名为B,类型为整型,元素个数为5*3个 维界:1:50 上界:下界 缺省下界为1 数组中元素的个数称为它的大小,维数称为秩,每维中元素的个数称为维的长度
19、,长度的序列称为形。,数组的引用:通过指定下标值的办法来实现。下标值可为整数或整型表达式。下标值不能越界,个数必须与数组的秩相等。注意:1.允许对数组名进行运算。2.允许对数组片段进行操作。所谓数组片段是指数组中某些连续元素的重新组合。数组片段也是一个数组。,2.3.8 字符子串,字符型常量又叫字符串。一个字符串的一部分称为子字符串或字符子串。字符数组:CHARACTER(LEN=1),DIMENSION(80):ROW引用:ROW(I)字符串:CHARACTER(LEN=80):ROW引用:ROW(I:I);ROW(4:7)特殊:ROW(:I)相当于 ROW(1:I)ROW(I:)相当于 R
20、OW(I:80)ROW(:)相当于 ROW(1:80)特定长度字符数组:CHARACTER(LEN=80),DIMENSION(25):ROWC引用:ROWC(I)(J:J),2.3.9 数据对象和子对象,由一个名引用的对象:有名标量有名数组由子对象标志符引用的子对象是:数组元素数组片段结构分量子串,2.4 程序单元概念,程序单元是FORTRAN语言的基本成分。程序单元可以是主程序、子程序、模块或块数据程序单元。子程序可以是函数子程序或子例行子程序。模块包含的说明是对其它的程序单元形成可访问性。块数据单元用来对有名公用区中的数据对象赋初值。(F90中不提倡使用),2.4.1 主程序,主程序是不
21、包含SUBROUTINE、FUNCTION、MODULE或BLOCK DATA语句作为其第一条语句的程序单元。主程序的可执行部分不能包含有RETURN语句或者ENTRY语句。程序名对可执行程序是全局的,而且不得于该可执行程序中的任何其它程序单元名、外部过程名或公用块名相同,也不得于主程序内的任何局部名相同。在主程序的作用范围内的说明不得包含OPTIONAL语句、INTENT语句、PUBLIC语句或它们的等价属性,在主程序内SAVE语句不起作用。主程序内的任何内部过程的定义必须跟在CONTAINS语句之后。,2.3.2 子程序,子程序是可以完成某一独立算法或功能的程序单元,但它功能的具体体现要通
22、过主程序(或子程序)的调用来实现。按子程序与主程序的位置关系分为内部过程和外部过程。内部过程可以出现在主程序、外部过程或模块内。,2.4.3 模块,模块也是一种在程序单元之外独立编写的程序单元。它有独特的形式,即模块程序单元内没有可执行语句,除了说明语句外,最多包含内部过程。模块的主要作用是供其它程序单元引用。程序单元引用模块,实际是将模块内的全部语句复制到本程序单元。模块的引用采用语句:USE 模块1,模块2,,2.4.4 块数据程序单元,块数据程序单元对有名公用块内的数据对象提供初值。由于块数据程序单元赖以支持的COMMON语句和DATA语句在F90中已成为过时特性,因此,不提倡使用块数据
23、程序单元。,45/149,GNU Compiler,GNU Compiler自由软件,一般操作系统都自带支持C/C+、Fortran77、Java、COBAL等等许多语言支持大部分硬件平台高性能计算中常用的:C/C+:GCC(GNU C/C+Compiler)Fortran 77:G77不支持Fortran 90/95不支持OpenMP是最常用的编译器,性能一般(相对于一些针对特定平台优化的编译器)由于缺少对Fortran 90/95,限制了其在高性能计算中的使用,46/149,PGI Compiler,PGI Compiler由Portland公司开发的编译器支持AMD Opteron/Al
24、thon处理器、Intel Xeon处理器等,在Opteron上同时支持32-bit和64-bit()支持Linux、Windows支持C/C+(pgcc)、Fortran77(pgf77)、Fortran90/95(pgf90)、HPF(High Performance Fortran)支持多线程和OpenMP最新版本:10.1需要购买,但可以从网上得到15天试用版本 http:/,47/149,Intel Compiler,Intel Compiler由Intel公司针对Intel处理器开发(Xeon、Pentium)支持Linux、Windows支持C/C+(icc:Intel C/C+
25、Compiler)、Fortran77/90/95(ifc:Intel Fortran Compiler)支持多线程和OpenMP需要购买,但可以从网上得到30天试用版本 http:/,48/149,编译优化,编译优化对于计算密集型程序的性能提高非常帮助优化消耗CPU资源最多的那部分,即计算密集部分一般采用-O2、-O3可以采用SIMD指令集,eg:Intel和AMD处理器的MMX、SSE1、SSE2具体编译优化的选项和编译器以及CPU相关,参见编译器手册对于有些应用程序,过分的优化会导致计算结果错误,49/149,编译优化,在双路Intel Xeon平台上,采用SSE2优化和不采用SSE2优
26、化,所获得的HPL性能。在这种情况下,采用SSE2技术得到的性能高出近90,50/149,编译简介,在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件大部分编译器通过后缀来区别输入文件的类别,下面来介绍常用的一些后缀.c:C语言源代码文件.f:Fortran 77语言源代码文件.o:编译后的目标文件.a:由目标文件构成的档案库文件.C、.cc、.cxx:C+源代码文件.f90:Fortran 90语言源代码文件.h:程序所包含的头文件,51/149,基本的用法,cc/f77/f90 options filenames 编译器名 编译参数 编译文件其中o
27、ptions就是编译器所需要的参数,filenames给出相关的文件名称,52/149,常用编译参数,-c:只编译,不连接成为可执行文件,编译器只是由输入的.c/.f等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。-o output_filename:确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,就给出预设的可执行文件a.out-g:产生符号调试工具所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。-O:对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的
28、可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。-O2、-O3、-O4:比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。(具体和编译器相关),53/149,常用编译参数,-Idirname:将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况:A)#include B)#include“myinc.h”其中,A类使用尖括号(),B类使用双引号(“”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而对于B类,cpp在当前目录中搜寻头文件,这个选项的作用是
29、告诉cpp,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。在程序设计中,如果我们需要的这种包含文件分别分布在不同的目录中,就需要逐个使用-I选项给出搜索路径。,54/149,常用编译参数,-Ldirname:将dirname所指出的目录加入到程序函数档案库文件的目录列表中,是在连接过程中使用的参数。在预设状态下,连接程序ld在系统的预设路径中(如/usr/lib)寻找所需要的档案库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后到系统预设路径中寻找,如果函数库存放在多个目录下,就需要依次使用这个选项,给出相应的存放目录。-lname:在连接时,装载名字
30、为“libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下。例如,-lm表示连接名为“libm.a”的数学函数库。上面我们简要介绍了编译器最常用的功能和主要参数选项,更为详尽的资料可以参看Linux系统的联机帮助。,55/149,GCC应用举例,1.gcc hello.c生成a.out2.gcc o hello helo.c生成hello3.gcc O o hello hello.c 生成hello4.gcc O2 o hello hello.c 生成hello5.gcc c hello.c生成hello.o gcc o hello hello.o生成hello6.
31、gcc c hello1.c生成hello1.o gcc c hello2.c生成hello2.o gcc o hello hello1.o hello2.o 生成hello7.gcc o test test1.o lm I/home/czn/include,MPI的安装,安装:#tar-xzvf mpich-1.2.6.tar.gz#cd mpich-1.2.6#./configure-with-device=ch_p4-prefix=/usr/local/mpich-1.2.6#make#make install环境变量设置#vi/etc/profile 加入下面的行 export MPI
32、_ROOT=/usr/local/mpich-1.2.6 export PATH=$MPI_ROOT/bin:$PATH export MANPATH=$MPI_ROOT/man:$MANPATH#source/etc/profile,MPI的使用,mpirun的基本格式为:mpirun mpirun-options options其中 mpirun-options,主要选项如下:-np 要加载的进程个数,系统读machines.LINUX的内容-p4pg 按照p4file文件中的要求加载用户进程-machinefile 按照machinesfile文件中的节点名个数加载进程p4file文件该
33、文件的格式为:第一行:第二行:.第 n行:其中n为用户要加载进程的个数。结点名可以相同,也可以不同。且用户使用此选项后,-np选项无效。machines.LINUX文件和machinefile文件内容:nodeX:Y.nodeZ:WX-Z:机群节点名(系统名字)比如节点1-20Y、W节点名对应的CPU个数,MPI使用简例,最简单的运行一个MPI应用程序的例子是:#mpirun-np 4 a.out,#mpirun machinefile machinefile a.out#mpirun p4pg./p4file a.out它将在并行机上加载个用户执行程序 一般情况下最好用-p4pg选项,p4f
34、ile文件包含有关进程在哪些节点上运行的信息。如你已登录到节点node1,并用4个节点执行你的并行程序 a.out,执行文件的全路径/public/user1/example/a.out,则p4file内容如下:node1 0/public/user1/example/a.outnode2 1/public/user1/example/a.out node3 1/public/user1/example/a.outnode4 1/public/user1/example/a.out执行命令为:#mpirun-p4pg./p4file a.out,MPI应用层优化,OMPI/public/ope
35、nmpi-1.3-pgi/bin/mpirun-np 64-mca btl openib,self,sm-mca btl_openib_max_btls 20-mca btl_openib_rd_num 128-mca btl_openib_rd_low 75-mca btl_openib_rd_win 50-mca btl_openib_max_eager_rdma 32-mca mpool_base_use_mem_hooks 1-mca mpi_leave_pinned 1-machinefile./ma./vasp.pgi.7,MPI for PGI,下载mpich.tar.gz解压
36、tar zxvf mpich.tar.gz进入mpich目录执行:#export CFLAGS=-fast#export CXXFLAGS=-fast#export FFLAGS=-fast#export F90FLAGS=-fast“#export LDFLAGS=-fast#export OPTFLAGS=-fast#export CC=pgcc#export CXX=pgCC#export F90=pgf90#export FC=pgf77#export CPP=pgCC-E“#./configure-prefix=/usr/local/mpich-pgi#make#make insta
37、ll,MPI for PGI,设置环境变量#vi/etc/profile 加入下面的行 export MPI_ROOT=/usr/local/mpich-pgi export PATH=$MPI_ROOT/bin:$PATH export MANPATH=$MPI_ROOT/man:$MANPATH#source/etc/profile,MPI for intel Compiler,将mpich解压后,进入mpich目录执行:#./configure-with-device=ch_p4-prefix=/usr/local/mpich-intel cc=icc fc=ifort c+=icpc
38、f90=ifort#make#make install设置环境变量相关#vi profile 添加:export MPICH_ROOT=/usr/local/mpich-intel export$PATH=$MPICH_ROOT/bin:$PATH export$MANPATH=$MPICH_ROOT/man:$MANPATH 执行#source/etc/profile即可,一、引子在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将
39、无法进行正确的编/译码从而导致通信失败。目前在各种体系的计算机中通常采用的字节存储机制主要有两种:big-edian和little-endian。为了叙述方便,下面先对本文中将要用到的两个术语做简单的定义。1、MSBMSB是Most Significant Bit/Byte的首字母缩写,通常译为最重要的位或者最重要的字节。它通常用来表明在一个bit序列(如一个byte是8个bit组成的一个序列)或者一个byte序列(如word是两个byte组成的一个序列)中对整个序列取值影响最大的那个bit/byte。2、LSBLSB是Least Significant Bit/Byte的首字母缩写,通常译为
40、最不重要的位或者最不重要的字节。它通常用来表明在一个bit序列(如一个byte是8个bit组成的一个序列)或者一个byte序列(如word是两个byte组成的一个序列)中对整个序列取值影响最小的那个bit/byte。,二、endian的来由,1、Definitionendian:The ordering of bytes in a multi-byte number.定义:在计算机系统体系结构中用来描述在多字节数中各个字节的存储顺序。,三、各种endian1、big-endianA computer architecture in which,within a given multi-byte
41、 numeric representation,the most significant byte has the lowest address(the word is stored big-end-first).Most processors,including the IBM 370 family,the PDP-10,the Motorola microprocessor families,and most of the various RISC designs current in mid-1993,are big-endian.From:Free On-Line Dictionary
42、 Of Computing or Jargon Filebig-endian:计算机体系结构中一种描述多字节存储顺序的术语,在这种机制中最重要字节(MSB)存放在最低端的地址上。采用这种机制的处理器有IBM3700系列、PDP-10、Mortolora微处理器系列和绝大多数的RISC处理器。+-+|0 x34|-0 x00000021+-+|0 x12|-0 x00000020+-+图1:双字节数0 x1234以big-endian的方式存在起始地址0 x00000020中,在Big-Endian中,对于bit序列中的序号编排方式如下(以双字节数0 x8B8A为例):bit 0 1 2 3 4
43、 5 6 7 8 9 10 11 12 13 14 15+-+val|1 0 0 0 1 0 1 1|1 0 0 0 1 0 1 0|+-+0 x8B 0 x8A MSB LSB 图2:Big-Endian的bit序列编码方式注1:通常在TCP/IP协议栈所说的网络序(Network Order)就是遵循Big-Endian规则。在TCP/IP网络通信中,通信双方把消息按照如图2的方式进行编码,然后按从MSB(Bit0)到LSB的顺序在网络上传送。,2、little-endianlittle-endian:计算机体系结构中一种描述多字节存储顺序的术语,在这种机制中最不重要字节(LSB)存放在最
44、低端的地址上。采用这种机制的处理器有PDP-11、VAX、Intel系列微处理器和一些网络通信设备。该术语除了描述多字节存储顺序外还常常用来描述一个字节中各个比特的排放次序。+-+|0 x12|-0 x00000021+-+|0 x34|-0 x00000020+-+图3:双字节数0 x1234以little-endian的方式存在起始地址0 x00000020中在Little-Endian中,对于bit序列中的序号编排和Big-Endian刚好相反,其方式如下(以双字节数0 x8B8A为例):bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0+-+val|1 0 0 0 1 0 1 1|1 0 0 0 1 0 1 0|+-+0 x8B 0 x8A MSB LSB 图4:Little-Endian的bit序列编码方式,3、middle-endian:middle-endian:除了big-endian和little-endian之外的多字节存储顺序就是middle-endian,比如以4个字节为例:象以3-4-1-2或者2-1-4-3这样的顺序存储的就是middle-endian。这种存储顺序偶尔会在一些小型机体系中的十进制数的压缩格式中出现,