请选择 进入手机版 | 继续访问电脑版
贠老师培训群:150322713    贠老师QQ:767708506

贠老师office培训-excel学习网

 找回密码
 立即注册
点击咨询贠老师
查看: 230|回复: 9

[C语言] 高位优先(big—endian)与低位优先(little-endian)的计算机有什么...

[复制链接]

3172

主题

3269

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
22860
发表于 2015-12-25 23:03:56 | 显示全部楼层 |阅读模式
高位优先与低位优先的区别仅仅在于一个字的哪一端是高位字节。换句话说,两者的区别在于你是喜欢从左向右数,还是喜欢从右向左数。但是,哪种方式都不见得比另一种方式更好。一个可移植的C程序必须能同时适用于这两种类型的计算机。

假设你的程序运行在short类型为两字节长的计算机上,并且把值258(十进制)存放到地址s3000H处的一个short类型中。因为short类型的长度为两字节,所以该值的一个字节存放在3000H处,另一个字节存放在3001H处。258(十进制)即0102H,所以该值的一个字节的内容为1,另一个字节的内容为2。那么,究竟内容为1和2的字节分别是哪一个呢?

其答案因机器的不同而不同。在高位优先的计算机上,高位字节就是低地址字节(“高位字节”指的是其值变化后使整个字的值变化最大的那个字节,例如,在值0102H中,01H就是高位字节,而02H是低位字节)。在高位优先的计算机上,字节中的内容如下所示:
    地址    2FFEH    2FFFH    3000H    3001H    3002H    3003H
   值      01H      02H

这种图示方式很直观——地址就象是尺子上的刻度值,低地址在左,高地址在右。在低位优先的计算机上,字节中的内容如下所示:
    地址    3003H    3002H    3001H    3000H    2FFFH    2FFEH
    值      01H      02H
这种图示方式同样很直观——低位字节存放在低地址中。

不幸的是,有些计算机采用高位优先的存储方式,而另一些计算机却采用低位优先的存储方式。例如,IBM兼容机和Macintosh机对高位字节和低位字节的处理方法就不同。

为什么这种区别会产生影响呢?试想一下,如果用fwrite()直接把一个short类型的值按两字节存到文件或网络上,不考虑格式和是否可读,而只是存为紧凑的二进制形式,会引起什么后果呢?如果在高位优先的计算机上存入这个值,而在低位优先的计算机上读出该值(或者反过来),那么存入的是0102H(258),读出的就是0201H(513)。

解决这个问题的办法是选择一种存储(和读取)方式,并且自始至终使用这种方式,而不是按存入内存的方式来存储short或int类型的值。例如,有些标准指定了“网络字节顺序(network byte order)”,它是一种高位优先顺序(即高位字节存放在低地址中)。例如,如果s是一个short类型值而a是一个由两个char类型组成的数组,那么下面这段代码
    a[0]=(s>>4)& Oxf;
    a[1]=s&0xf;
将把s的值按网络字节顺序存入a的两个字节中。不管程序是运行在高位优先或低位优先的计算机上,s的值都会存成这种形式。

你可能会注意到,笔者一直没有提到哪种计算机是高位优先或低位优先的计算机。这样做是有目的的——如果可移植性是重要的,你就应该按这两种类型的计算机都能接受的方式编写程序;如果效率是重要的,通常你仍然要按这两种类型的计算机都能接受的方式编写程序。

例如,在高位优先的计算机上可以用一种更好的方法去实现上例中的那段代码,即使你使用了上例中的代码,一个好的编译程序仍然会利用那种更好的实现来产生机器代码。

注意:“big-endian"和"little-endian"这两个名称来源于Jonathan Swift所写的《格列佛游记>>(Gulliver's Travels)一书。在格列佛第三次出海时,他遇到了这样一群人,他们对煮熟了的鸡蛋的吃法争论不休:有的要先吃大头,有的要先吃小头。

“网络字节顺序”只适用于int,short和long类型。char类型的值按定义只有一字节长,因此字节顺序与它无关。对于float和double类型的值,没有一种标准的存储方式。
回复

使用道具 举报

2

主题

1063

帖子

156

积分

注册会员

Rank: 2

积分
156
发表于 2016-1-12 11:18:56 | 显示全部楼层
谢谢您的分享!
回复 支持 反对

使用道具 举报

3

主题

1016

帖子

53

积分

注册会员

Rank: 2

积分
53
发表于 2016-1-30 17:16:59 | 显示全部楼层
请问大家有什么看法?我绝对喜欢这个帖子
回复 支持 反对

使用道具 举报

0

主题

966

帖子

50

积分

注册会员

Rank: 2

积分
50
发表于 2016-11-11 16:55:34 | 显示全部楼层
好东西一定要看看!
回复 支持 反对

使用道具 举报

1

主题

880

帖子

7

积分

注册会员

Rank: 2

积分
7
发表于 2017-9-6 21:46:32 | 显示全部楼层
请问大家有什么看法?我绝对喜欢这个帖子
回复 支持 反对

使用道具 举报

1

主题

880

帖子

7

积分

注册会员

Rank: 2

积分
7
发表于 2017-12-20 22:58:42 | 显示全部楼层
佩服你,能发这么好的帖子,厉害
回复 支持 反对

使用道具 举报

3

主题

1016

帖子

53

积分

注册会员

Rank: 2

积分
53
发表于 2018-2-6 12:30:50 | 显示全部楼层
先收藏再学习,谢谢啦!
回复 支持 反对

使用道具 举报

1

主题

880

帖子

7

积分

注册会员

Rank: 2

积分
7
发表于 2018-3-17 21:37:08 | 显示全部楼层
有些不是太明白,研究研究再说
回复 支持 反对

使用道具 举报

1

主题

1045

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2018-7-26 16:15:59 | 显示全部楼层
不错的平台,以后需要经常光顾!
回复 支持 反对

使用道具 举报

0

主题

966

帖子

50

积分

注册会员

Rank: 2

积分
50
发表于 2018-11-28 20:15:46 | 显示全部楼层
希望楼主能够收集更多的资料,谢谢了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



陕ICP备15003731号  

贠老师培训 GMT+8, 2018-12-14 22:43 , Processed in 0.244706 second(s), 29 queries .

快速回复 返回顶部 返回列表