现在的位置: 首页 > 综合 > 正文

一个指针转换引起的问题及谈起”高位优先,低位优先”

2013年10月12日 ⁄ 综合 ⁄ 共 965字 ⁄ 字号 评论关闭

hpaix机上试一下这个程序就知道

int4字节,short2字节

 

#include

int main()

{

   int i=0;

   fun(&i);

   printf("%i  %x\n",i,i);

   return;

}

int fun(short * i)

{

  *i=2;

}

 

从已有知识,我认为打印出来的是:  2,2

但是,在hpaix机器上,

打印的结果是:

131072  20000

 

在具体分析之前,先介绍高位优先,低位优先的概念。

英文名词叫做 Big-EndianLittle-Endian”,网上找了一段说明

Big-Endian Little-Endian
字节排序

字节排序

含义

Big-Endian

一个Word中的高位的Byte放在内存中这个Word区域的低地址处。

Little-Endian

一个Word中的低位的Byte放在内存中这个Word区域的低地址处。

好了,回到上述问题,目前hprs6000的机器大都是高位优先。

假设,I所代表的内存地址在:  0x0000  
  0x0003,

I指面的地址为  0x0000

这块内存初始值为

最后,函数返回,因为是大边机器,所以I现在的值是:

  0x 2 00 00,即上述所描述的。

以前在pc上,都是低位优先,所以经常把指针类型强转了一下就用了,但是在hp,rs6000等这种机器上开发,就造成了很大的问题。把这个问题提出来,希望有用c语言开发的同事们也能了解并引起重视。

必须注意的是:表中一个Word的长度是16位,一个Byte的长度是8位。如果一个数超过一个Word的长度,必须先按Word分成若干部分,然后每一部分(即每个Word内部)Big-Endian或者Little-Endian的不同操作来处理字节。

一个例子:
如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
                big-endian     little-endian
0x0000     0x12              0xcd
0x0001     0x34              0xab
0x0002     0xab              0x34
0x0003     0xcd              0x12

转载自:

http://blogmango.bokee.com/2432535.html

抱歉!评论已关闭.