判断系统CPU是大端还是小端 详解
2012-04-22 16:23
337 查看
判断系统CPU是大端还是小端 详解
所谓的大端小端就是CPU在存储数据的时候是从高地址开始存储还是低地址开始存储。例如在sizeof(int) = 2的系统中,1 + (2 << 8)= 1 + 512 = 513,我们把这个值赋值给int nTemp = 1 + (2 << 8)。我们假定系统分配给变量nTemp的地址空间为:0x0000FF08到0x0000FF09,那么0x0000FF08开始的8个位为第一个字节的存储空间,0x0000FF09开始的8个位为第二个字节的存储空间。
如果CPU为大端,内存中的存储分配则为:
0x0000FF08:00000010(二进制) -> 2 (十进制)
0x0000FF09:00000001(二进制) -> 1 (十进制)
如果CPU为小端,内存中的存储分配则为:
0x0000FF08:00000001(二进制) -> 1 (十进制)
0x0000FF09:00000010(二进制) -> 2 (十进制)
那么如何判断系统CPU是大端还是小端呢???
我们可以利用C中的的共用体union和char类型,共用体的数据成员是共享存储空间的,而char类型在任何系统中都是一个字节。
我们可以定义一个共用体
union
{
char element[sizeof(int)];
int sum;
};
然后对共用体的sum进行赋值,只要判断element各个元素的值就可以知道系统CPU为大端,还是小端。因为共同体是共享存储的,我们这里假定测试系统sizeof(int)为2,那么element[0]的内容为sum存储空间中的第一个字节的内容,element[1]的内容为sum存储空间的第二个字节的内容。如果CPU为小端则表达式(int)(element[0]) + ((int)elememt[1] << 8)的值将等于sum。如果CPU的大端则表达式(int)(element[1]) + ((int)elememt[0] << 8)的值将等于sum。
下面给出可移植的代码来判断系统的CPU是大端还是小端。
最后给出在不同系统上上述代码的运行结果:、
在我自己机子上运行结果:
在HP服务器上的运行结果:
所谓的大端小端就是CPU在存储数据的时候是从高地址开始存储还是低地址开始存储。例如在sizeof(int) = 2的系统中,1 + (2 << 8)= 1 + 512 = 513,我们把这个值赋值给int nTemp = 1 + (2 << 8)。我们假定系统分配给变量nTemp的地址空间为:0x0000FF08到0x0000FF09,那么0x0000FF08开始的8个位为第一个字节的存储空间,0x0000FF09开始的8个位为第二个字节的存储空间。
如果CPU为大端,内存中的存储分配则为:
0x0000FF08:00000010(二进制) -> 2 (十进制)
0x0000FF09:00000001(二进制) -> 1 (十进制)
如果CPU为小端,内存中的存储分配则为:
0x0000FF08:00000001(二进制) -> 1 (十进制)
0x0000FF09:00000010(二进制) -> 2 (十进制)
那么如何判断系统CPU是大端还是小端呢???
我们可以利用C中的的共用体union和char类型,共用体的数据成员是共享存储空间的,而char类型在任何系统中都是一个字节。
我们可以定义一个共用体
union
{
char element[sizeof(int)];
int sum;
};
然后对共用体的sum进行赋值,只要判断element各个元素的值就可以知道系统CPU为大端,还是小端。因为共同体是共享存储的,我们这里假定测试系统sizeof(int)为2,那么element[0]的内容为sum存储空间中的第一个字节的内容,element[1]的内容为sum存储空间的第二个字节的内容。如果CPU为小端则表达式(int)(element[0]) + ((int)elememt[1] << 8)的值将等于sum。如果CPU的大端则表达式(int)(element[1]) + ((int)elememt[0] << 8)的值将等于sum。
下面给出可移植的代码来判断系统的CPU是大端还是小端。
#include <stdio.h> #include <string.h> union BigOrSmall { char element[sizeof(int)]; int sum; }; bool checkBigOrSmall() { int i; int j; char strTemp[9]; int nLen = sizeof(int); BigOrSmall bigOrSmall; bigOrSmall.sum = 0; for (i = 0; i < nLen; ++i) { bigOrSmall.sum += (i + 1) << (8 * (i)); } int sum = 0; for (i = 0; i < nLen; ++i) { sum += bigOrSmall.element[i] << (8 * (i)); } for (i = 0; i < nLen; ++i) { printf("the %d byte address:0x%08x ",i + 1, &bigOrSmall.element[i]); ///从低到高取出bigOrSmall.element[i]的每一位 for (j = 0; j < 8; ++j) { if (1 & (bigOrSmall.element[i] >> j)) { strTemp[7 - j] = '1'; } else { strTemp[7 - j] = '0'; } } strTemp[8] = 0; printf("%s(bin) -> %d(dec)\n", strTemp, bigOrSmall.element[i]); } if (sum == bigOrSmall.sum) { return false; ///小端 } else { return true; ///大端 } } int main() { if (checkBigOrSmall()) { printf("The type of cpu is big\n"); } else { printf("The type of cpu is small\n"); } return 0; }
最后给出在不同系统上上述代码的运行结果:、
在我自己机子上运行结果:
在HP服务器上的运行结果:
相关文章推荐
- 判断系统CPU是大端还是小端
- 判断系统CPU是大端还是小端
- 判断CPU或JVM是大端还是小端的方法——字节数组与整形互转
- 如何判断机器CPU是大端模式还是小端模式
- 如何判断CPU是大端还是小端
- 代码实现判断cpu是大端对齐还是小端对齐
- 笔试面试7 如何判断一个系统的存储方式是大端还是小端
- 如何判断CPU是大端还是小端模式
- 利用联合体判断CPU是大端模式还是小端模式
- 如何判断CPU是大端还是小端模式
- 如何判断CPU是大端模式还是小端模式
- 判断CPU是大端还是小端模式
- 如何判断CPU是大端还是小端模式
- 利用union判断CPU是大端模式还是小端模式
- 如何判断CPU是大端存放还是小端存放
- 一个程序判断CPU是大端还是小端
- 判断CPU 是小端存储(Little endian)还是大端存储(Big endian)模式
- 如何判断CPU是大端还是小端模式
- 写个程序判断系统是多少位,是大端还是小端
- 如何判断CPU是大端还是小端模式