写一个函数,判断不同模式处理器的返回值

处理器有两种:

Big_endian 、Little_endian  的模式

Big_endian模式对操作数的存放方式是从高字节到低字节。高字节存放数字的低位,低字节存放数据的高位。

Little_endian模式对操作数的存放方式是从低字节到高字节。低字节存放数字的低位,高字节存放数据的高位。

如:0x1234

内存地址:0x4000    0x4001

Little_endian:       0x4000:  0x34                   0x4001:   0x12

Big_endian   :       0x4000:  0x12                   0x4001:   0x34

 

 

联合体union 的存放顺序是所有成员都从低地址开始存放。联合体(共用体)的数据成员都是从低地址开始存放。
使用union可以查看CPU的模式。若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1

代码如下:

#include<iostream>
using namespace std;
int CheckCPU()
{
	union w
	{
		int a;//4 bytes
		char b;//1 bytes
	}c;
	c.a=1;
	return (c.b==1);
}
int main(int argc, char* argv[])
{
	int i;
	i=CheckCPU();
	if (i==1)
	{
		cout<<"Little_endian"<<endl;
	}
	else
	{
		cout<<"Big_endian"<<endl;
	}
	return 0;
}


若是大端模式,由低地址到高地址c.a存放为0x00     0x00     0x00     0x01,c.b被赋值为0x00

若是小端模式,由低地址到高地址c.a存放为0x01     0x00     0x00      0x00,c.b被赋值为0x01

 

下面一个例子:

#include<iostream>
using namespace std;
void CheckCPU()
{
	union w
	{
		char b[4];//1 bytes
		int a;//4 bytes
		short int d;//2 bytes
	}c;
	c.b[0]=2;
	c.b[1]=1;
	c.b[2]=3;
	c.b[3]=0;
	cout<<"c.a="<<c.a<<endl;
	cout<<"c.d="<<c.d<<endl;
}
int main(int argc, char* argv[])
{
	CheckCPU();
	return 0;
}


输出:

c.a=196866
c.d=258

 

b中数据为:0x02  0x01  0x03  0x00

a:  4个字节,所以,

Big_endian : 内存中数据存放为:0x02   0x01   0x03   0x00

Little_endian: 内存中数据存放为:0x00  0x03  0x01  0x02         c.a=0x00  0x03  0x01  0x02    =196866

d:  2个字节,所以,

Big_endian : 内存中数据存放为:0x02   0x01   0x03   0x00

Little_endian: 内存中数据存放为:0x01  0x02    0x00  0x03         c.d=0x01  0x02=258

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值