博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大端和小端
阅读量:6852 次
发布时间:2019-06-26

本文共 1158 字,大约阅读时间需要 3 分钟。

                                                              大端和小端

    嵌入式开发者应该对大端和小端很熟悉。在内存单元中数据是以字节为存储单位的,对于多字节数据,在小端模式中,低字节数据存放在低地址单元,而在大端模式中,低字节数据存放在高地址单元。比如一个定义一个short型的变量a,赋值为1,由于short型数据占2字节。

在小端模式中,其存放方式为

0X4000  00000001

0X4001  00000000

而在大端模式中,其存放方式为

0X4000  00000000

0X4001  00000001

若需用程序验证系统是大端模式还是小端模式(一般我们用的x86结构的都是小端模式),有两种方法

1.利用联合体的性质

    因为联合体中的成员是共享内存的,并且数据是从低地址存放的,可以利用这一性质判断。

typedef union {    char a;    short c;}U;int checkCPU1()  //若是小端则返回1,否则返回0 {    U u;    u.c=1;    //printf("%d\n",u.a);    return u.a==1;}

由于short占2字节,而char占1字节,当对c赋值为1时,若系统为小端模式,则在系统中存放方式为:

000000001

000000000

那么当取a的值时,a的整型值必定为1;否则为0.

2.强制取低地址单元的数据

int checkCPU2(){    short a=0x1234;    char *p=(char *)&a;    //printf("%d\n",*p);    return *p==0x34;    }

很显然,若是小端模式,指针p指向的单元里面的数据整型值必为0x34,否则为0x12。

测试程序:

/*测试系统大端模式/小端模式 2011.10.1*/ #include 
using namespace std;typedef union { char a; short c;}U;int checkCPU1() //若是小端则返回1,否则返回0 { U u; u.c=1; //printf("%d\n",u.a); return u.a==1;}int checkCPU2(){ short a=0x1234; char *p=(char *)&a; //printf("%d\n",*p); return *p==0x34; } int main(int argc, char *argv[]){ printf("%d\n",checkCPU1()); printf("%d\n",checkCPU2()); return 0;}

转载地址:http://djyyl.baihongyu.com/

你可能感兴趣的文章
系统架构介绍
查看>>
oracle唯一约束
查看>>
C++获取类成员函数地址
查看>>
【MOOC手写体】王文敏教授.《人工智能原理》 第10章 机器学习的任务 Part5 C10.2 Classification 分类...
查看>>
Plot transpant lines in Matleb 在Matlab中绘制透明线条
查看>>
MsChart<1> 线性图
查看>>
C# 调试之 Debug.WriteLine()、Trace.WriteLine()
查看>>
META Header实例讲解(转)
查看>>
自动备份5天前的日志
查看>>
一个小方法解决RGBA不兼容IE8
查看>>
SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
查看>>
Linux基础-优良文本处理工具awk
查看>>
DIV 全屏遮罩
查看>>
nexus 开机自启动
查看>>
Median of Two Sorted Arrays
查看>>
Go中链路层套接字的实践
查看>>
linux驱动的异步通知(kill_fasync,fasync)---- 驱动程序向应用程序发送信号
查看>>
安装Pycharm
查看>>
Laravel 4 Blade模板引擎
查看>>
数据持久化存储回顾
查看>>