判断系统CPU是大端还是小端 详解

来源:互联网 发布:参加淘宝嘉年华 编辑:程序博客网 时间:2024/04/29 15:56

判断系统CPU是大端还是小端 详解

所谓的大端小端就是CPU在存储数据的时候是从高地址开始存储还是低地址开始存储。例如在sizeof(int) = 2的系统中,1 + 2 << 8= 1 + 512 = 513,我们把这个值赋值给int nTemp = 1 + (2 << 8)。我们假定系统分配给变量nTemp的地址空间为:0x0000FF080x0000FF09,那么0x0000FF08开始的8个位为第一个字节的存储空间,0x0000FF09开始的8个位为第二个字节的存储空间。

如果CPU为大端,内存中的存储分配则为:

0x0000FF0800000010(二进制) -> 2 (十进制)

0x0000FF0900000001(二进制) -> 1 (十进制)

如果CPU为小端,内存中的存储分配则为:

0x0000FF0800000001(二进制) -> 1 (十进制)

0x0000FF0900000010(二进制) -> 2 (十进制)

那么如何判断系统CPU是大端还是小端呢???

我们可以利用C中的的共用体unionchar类型,共用体的数据成员是共享存储空间的,而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服务器上的运行结果:


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 西澳大学工程挂科怎么办 澳洲语言班没过怎么办2018 杨浦区对口公立小学太差怎么办 公立小学太差了怎么办 澳大利亚出国留学怎么办-语言课程 学校不给释放信怎么办 重修费交不起钱怎么办 不想用家里的钱怎么办 三本学费太贵怎么办 从日本往中国汇款怎么办 学费钱大一没交怎么办 初中孩子和同学相处不好怎么办 使用假护照出国被发现怎么办 酒店忘记退房了怎么办 语言课申请不上怎么办 学会计的应届生想转行怎么办 上班熬不下去了怎么办 墨大选修挂科怎么办 日本签证年收入没有10w怎么办 做生意的办房贷没有薪资流水怎么办 澳洲医保卡丢了怎么办 澳洲爱他美上火怎么办 学信网学籍在籍没交学费怎么办 宝宝从床上摔下来怎么办 狗没打针被咬了怎么办 狗咬了没破皮没出血怎么办 被宠物狗咬了出血了怎么办 让狗咬了下红了怎么办 狗牙齿碰到红了怎么办 加拿大学生签背景调查了怎么办 gpa不到3该怎么办英国 内地学生赴港签证怎么办 学生去日本旅游签证怎么办 澳洲未婚妻签需要单身证明怎么办 高院收到申诉材料怎么办? 辞职出国留学后社保怎么办 高三数学40来分怎么办 论文查重表格内容重复怎么办 榕树叶子掉光了怎么办 2017江苏高考2c怎么办 高考刚过三本线怎么办