大端、小端问题详解
2012-05-25 10:18:19 来源:WEB开发网核心提示:Big-Endian优点:靠首先提取高位字节,你总是可以由看看在偏移位置为0的字节来确定这个数字是 正数还是负数,大端、小端问题详解(4),你不必知道这个数值有多长,或者你也不必过一些字节来看这个数值是否含有符号位,这就意味着计算机中的某些计算可以变得更加简单和快速,六、如何检查处理器是Big-Endian还是Litt
Big-Endian优点:靠首先提取高位字节,你总是可以由看看在偏移位置为0的字节来确定这个数字是 正数还是负数。你不必知道这个数值有多长,或者你也不必过一些字节来看这个数值是否含有符号位。这个数值是以它们被打印出来的顺序存放的,所以从二进制到十进制的函数特别有效。因而,对于不同要求的机器,在设计存取方式时就会不同。
Little-Endian优点:提取一个,两个,四个或者更长字节数据的汇编指令以与其他所有格式相同的方式进行:首先在偏移地址为0的地方提取最低位的字节,因为地址偏移和字节数是一对 一的关系,多重精度的数学函数就相对地容易写了。
如 果你增加数字的值,你可能在左边增加数字(高位非指数函数需要更多的数字)。 因此, 经常需要增加两位数字并移动存储器里所有Big-endian顺序的数字,把所有数向右移,这会增加计算机的工作量。不过,使用Little- Endian的存储器中不重要的字节可以存在它原来的位置,新的数可以存在它的右边的高位地址里。这就意味着计算机中的某些计算可以变得更加简单和快速。
六、如何检查处理器是Big-Endian还是Little-Endian?
由于联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性就可以轻松地获得了CPU对内存采用Little- endian还是Big-endian模式读写。例如:
const int endian = 1; #define isLittleEndian ((*((char*)&endian))==1) #define isBigEndian ((*((char*)&endian))==0)
int checkCPUEndian(){ union { unsigned int a; unsigned char b; }c; c.a = 1; return (c.b == 1); } /*return 1 : little-endian, return 0:big-endian*/
更多精彩
赞助商链接