大端小段
来源:互联网 发布:linux 端口访问权限 编辑:程序博客网 时间:2024/04/29 13:26
作者:海子
出处:http://www.cnblogs.com/dolphin0520/
嵌入式开发者应该对大端和小端很熟悉。在内存单元中数据是以字节为存储单位的,对于多字节数据,在小端模式中,低字节数据存放在低地址单元,而在大端模式中,低字节数据存放在高地址单元。比如一个定义一个short型的变量a,赋值为1,由于short型数据占2字节。
在小端模式中,其存放方式为
0X4000 00000001
0X4001 00000000
而在大端模式中,其存放方式为
0X4000 00000000
0X4001 00000001
若需用程序验证系统是大端模式还是小端模式,有两种方法
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 <iostream>
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;
}
- 大端小段
- 大端对齐和小段对齐
- 判断CPU是大端,还是小段
- 大端模式和小段模式简述
- C++大端小段的判断和转换
- 关于大端序和小段序
- 大端存储 小段存储 网络字节顺序
- 结构体struct union -大端小段
- 有一小段C程序看大端、小端模式
- Union的内存模型-大端模式和小段模式
- 如何判断系统是大端还是小段算法
- 网络通信的大端模式和小段模式
- union是什么【编写一个判断大端小段c程序】
- 判断主机是大端还是小段-C语言
- 小段
- 判断CPU模式是大端还是小段(big-Endian和little-Endian)
- 大端格式、小段格式,以及数据在内存中的存储方式
- Linux下的C语言编程——判断大端小段字节序
- UltraEdit for Linux 3.3 keygen/破解
- google的十大搜索技巧
- C#异步调用的好处和方法
- 黑马程序员 java集合框架笔记(二)
- CentOS6.3下安装VirtualBox虚拟机
- 大端小段
- Android之EditText只能输入数字或自定义字符
- Windows下ORACLE 10g安装与操作图解
- eclipse中几种加入jar包方式的区别的简介与内容
- Miller_Rabin素数测试
- s3c2440的pwm输出
- BeautifulSoup解析HTML(一)
- 小试结构体
- ubuntu10.04配置samba服务器