在hp或aix机上试一下这个程序就知道
int为4字节,short为2字节
#include int main() { int i=0; fun(&i); printf("%i %x\n",i,i); return; } int fun(short * i) { *i=2; }
从已有知识,我认为打印出来的是: 2,2
但是,在hp或aix机器上,
打印的结果是:
131072 20000
在具体分析之前,先介绍”高位优先,低位优先”的概念。
英文名词叫做” Big-Endian和Little-Endian”,网上找了一段说明
Big-Endian 和 Little-Endian
字节排序
字节排序 |
含义 |
Big-Endian |
一个Word中的高位的Byte放在内存中这个Word区域的低地址处。 |
Little-Endian |
一个Word中的低位的Byte放在内存中这个Word区域的低地址处。 |
好了,回到上述问题,目前hp跟rs6000的机器大都是高位优先。
假设,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