一个关于大端小端的有关问题,就解惑~
一个关于大端小端的问题,就解惑~~
之前看资料,其中说到:
“涉及字符串的不用考虑byte order,字符串是一系列的byte,
比如字符串 'abcd'不管在什么机器上,都是"0x61 0x62 0x63 0x64".
只有在机器需要把多个byte合并起来表示某个值的时候,比如用四个byte表示一个int的时候, 才有byte order的区别. ”
我有个问题是:
在big-endian,低位地址存放数据的高字节,
那么,内存里面由低到高依次是: 0x61,0x62,0x63,0x64 就是abcd
在 little-endian,低位地址存放数据低字节,
那么,内存里面由低到高依次是: 0x64,0x64,0x62,0x61 那么数据最后不就是dcba了么。怎么会不管在什么机器上都是abcd呢?
我是哪里理解错了啊?
------解决方案--------------------
大端CPU读大端写的数据,当然没问题
小端同理
只有大端读取小端写的数据才会出现问题.
LZ想岔了吧
------解决方案--------------------
举个例子,小端写入0x64,0x64,0x62,0x61
读出来的也是从高往低读,读出来的自然还是a,b,c,d啦
------解决方案--------------------
大端机器 写和读都是大端
小端机器 写和读都是小端
但是大端读小端,小端读大端就有问题,这个是兼容性。跨平台写软件就需要处理
------解决方案--------------------
[code]
/**
* @file endian.c
* @brief
*/
#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
union {
unsigned int u;
unsigned char c[4];
} x;
x.u = 0x01020304;
printf("%08x\n", x.u);
for (i = 0; i < 4; i++)
printf("%02x", (unsigned int)(unsigned char)x.c[i]);
printf("\n");
return 0;
}
[/code]
小端的x86下输出
01020304
04030201
大端的POWER AIX下输出
01020304
01020304
之前看资料,其中说到:
“涉及字符串的不用考虑byte order,字符串是一系列的byte,
比如字符串 'abcd'不管在什么机器上,都是"0x61 0x62 0x63 0x64".
只有在机器需要把多个byte合并起来表示某个值的时候,比如用四个byte表示一个int的时候, 才有byte order的区别. ”
我有个问题是:
在big-endian,低位地址存放数据的高字节,
那么,内存里面由低到高依次是: 0x61,0x62,0x63,0x64 就是abcd
在 little-endian,低位地址存放数据低字节,
那么,内存里面由低到高依次是: 0x64,0x64,0x62,0x61 那么数据最后不就是dcba了么。怎么会不管在什么机器上都是abcd呢?
我是哪里理解错了啊?
------解决方案--------------------
大端CPU读大端写的数据,当然没问题
小端同理
只有大端读取小端写的数据才会出现问题.
LZ想岔了吧
------解决方案--------------------
举个例子,小端写入0x64,0x64,0x62,0x61
读出来的也是从高往低读,读出来的自然还是a,b,c,d啦
------解决方案--------------------
大端机器 写和读都是大端
小端机器 写和读都是小端
但是大端读小端,小端读大端就有问题,这个是兼容性。跨平台写软件就需要处理
------解决方案--------------------
[code]
/**
* @file endian.c
* @brief
*/
#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
union {
unsigned int u;
unsigned char c[4];
} x;
x.u = 0x01020304;
printf("%08x\n", x.u);
for (i = 0; i < 4; i++)
printf("%02x", (unsigned int)(unsigned char)x.c[i]);
printf("\n");
return 0;
}
[/code]
小端的x86下输出
01020304
04030201
大端的POWER AIX下输出
01020304
01020304