发布网友 发布时间:2022-05-01 01:27
共4个回答
热心网友 时间:2022-06-21 22:03
不同的CUP框架,采用不同的模式。一般来说,x86系列CPU都是little-endian的字节序,PowerPC通常是Big endian。
对于整型、长整型等数据类型,Big endian认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节)。
而Little endian则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放数据的低位字节到高位字节)。
Big: 从内存地址的低到高位保存数据的从高到底位Little:从内存地址的低到高位保存数据的从低到高位内存内容如下:0x00000x00010x00020x00030x120x230xab0xcd 如果是big:读出来的内容是0x1234abcd,如果是little读出来的内容是0xcdab3412 把0x1234abcd写入:内存地质0x00000x00010x00020x0003Big0x120x230xab0xcdLittle0xcd0xab0x340x12
CPU能通过跳线来设置CPU工作于Little endian还是Big endian模式。 解答这个问题的方法只能是将一个字节(CHAR/BYTE类型)的数据和一个整型数据存放于同样的内存开始地址,通过读取整型数据,分析CHAR/BYTE数据在整型数据的高位还是低位来判断CPU工作于Little endian还是Big endian模式。
得出如下的答案:typedef unsigned char BYTE;int main(int argc, char* argv[]){ unsigned int num,*p; p = # num = 0; *(BYTE *)p = 0xff; if(num == 0xff) { printf("The endian of cpu is little\n"); } else //num == 0xff000000 { printf("The endian of cpu is big\n"); } return 0;} 除了上述方法(通过指针类型强制转换并对整型数据首字节赋值,判断该赋值赋给了高位还是低位)外,还有没有更好的办法呢?,union的成员本身就被存放在相同的内存空间(共享内存,正是union发挥作用、做贡献的去处),因此,可以将一个CHAR/BYTE数据和一个整型数据同时作为一个union的成员,得出如下答案:int checkCPU(){ { union w { int a; char b; } c; c.a = 1; return (c.b == 1); }} 实现同样的功能,来看看Linux操作系统中相关的源代码是怎么做的:static union { char c[4]; unsigned long l; } endian_test = { { 'l', '?', '?', 'b' } };#define ENDIANNESS ((char)endian_test.l)Linux的内核作者们仅仅用一个union变量和一个简单的宏定义就实现了一大段代码同样的功能。
热心网友 时间:2022-06-21 22:04
跟平台有关吧。大端和小端是就cpu读取方式来讲的。android的应用层开发一般用java语言写,java语言与平台无关,所以不需要关心大小端热心网友 时间:2022-06-21 22:04
Intel计算机采用的是Ltttle Endian,而Motorola处理器、IBM大型机、SPARC处理器和ARM处理器使用Little Endian方案。热心网友 时间:2022-06-21 22:05
是little endain ,好像makefile 里有相关编译参数的定义