CPU的大小端及如果判断

不同体系结构的CPU,数据在内存中存放的排列顺序是不一样的。

存储器中对数据的存储是以字节(Byte)为基本单位的,因此,字(Word)和半字(Half-Word)在存储器中就有两种次序,分别称为:大端模式(Big Endian)小端模式(Little Endian)

大端存储模式是指字或半字的最高字节(Most Significant Bit,MSB)存放在内存的最低位字节地址上,而字数据的低字节则存放在高地址中。打个比方,有一个字为0×12345678,这个字由4个字节组成, 从高位到低位的次序为:0×12,0×34,0×56,0×78。

大端模式的次序就像是我们平时书写的次序,先写大数,后写小数。另外,大端存储次序还广泛运用在TCP/IP协议上,因此又称为网络字节次序

小端存储模式是指字或半字的最低位字节(Lowest Significant Bit,LSB)存放在内存的最低位字节地址上,而字数据的高字节则存放在高地址中。

需要注意的几点是:

(1)   数据在寄存器中都是以大端模式次序存放的。

(2)   对于内存中以小端模式存放的数据。CPU存取数成时,小端和大端之间的转换是通过硬件实现的,没有数据加载/存储的开销。

用一个联合体判断大小端:

int CheckEndian(void)
{
union check
{
int  Word;
char Half;

} Endian;

Endian.Word=1;

if(1 == Endian.Half)
return Little_Endian;
else
return Big_Endian;
}

时间: 2024-08-08 05:16:00

CPU的大小端及如果判断的相关文章

CPU的大小端模式

大小端模式的定义在百度百科上有明确的说法,意思就是就是数据的高位存储在第地址的是低位的是大端模式,数据的高位存储在地址的低位的就是小端模式.说着也不清楚.我们这里讨论的是CPU的大小端模式而不是通讯协议的大小端.要记住的是现在主流的CPU都是小端模式例如arm等,大端模式的代表是c51系列.还有要知道的是怎么测量当前平台是什么模式一般来说流行的有两种方法一种是用union但这种方法也是基于指针的其实能理解好指针测量的方法就能写出共用体的方法.测量方法如下int a=1;char b;b=((ch

大小端模式与网络字节序

一.为什么会出现大小端模式? 不同的cpu采用的大小端模式不一致.X86是小端模式.而KEIL C51则为大端模式.很多的ARM,DSP都为小端模式.有些ARM处理器还可以由硬件来选择是大端模式还是小端模式. 二.大小端模式的不同带来的问题是什么?如何解决? 如果存在数据网络传输,如果大小端模式不一致,如果不经过转换,必然会导致数据不致,出现错误. 解决方法:统一将网络上传输的字节序采用同一种模式(大家都知道的),这样收发数据时,就会根据主机对应的模式是否和网络字节对应的模式一致,来判断是否需要

C/C++ 关于大小端模式

大端模式:  数据的高字节存在低地址  数据的低字节存在高地址 小端模式:  数据的高字节存在高地址  数据的低字节存在低地址 如图,i为int类型占4个字节,但只有1个字节的值为1,另外3个字节值为0:取出低地址上的值,当其为1时则为小端模式,为0时为大端模式. //大小端模式的判断 //方法一:利用联合体所有成员的起始位置一致, //对联合体中的int类型赋值,然后判断联合体中char类型的值的大小 void SysCheck() { union IsLitte_Endian { int i

[C&C++]大小端字节序转换程序

大端模式:  数据的高字节存在低地址  数据的低字节存在高地址 小端模式:  数据的高字节存在高地址  数据的低字节存在低地址 如图,i为int类型占4个字节,但只有1个字节的值为1,另外3个字节值为0:取出低地址上的值,当其为1时则为小端模式,为0时为大端模式. //大小端模式的判断 //方法一:利用联合体所有成员的起始位置一致, //对联合体中的int类型赋值,然后判断联合体中char类型的值的大小 #include <iostream> #include <iomanip>

判断cpu硬件的大小端

大小端是由cpu硬件决定的大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中:小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中 #include <stdio.h> int check_sys() { int i = 1; return (*(char *)&i); } int main() { int ret = check_sys(); if(ret == 1) { printf("该电脑是小

[C/C++]_[初级]_[判断大小端序Little Endian Order]

场景: 1. 在读取硬盘数据和媒体数据时,需要根据读取的数据进行大小端序的转换,以正确识别数据.其中一个处理就是首先要判断cpu支持的大小端序情况才能转换. 2. Little Endian Order: 低地址存低位(整数的高低位)的数据. test.cpp #include <stdio.h> #include <iostream> using namespace std; //1.方法1,通过判断int的低位是否存储了数值. int IsLittleEndian1() { i

CPU大小端模式及转换

通信协议中的数据传输.数组的存储方式.数据的强制转换等这些都会牵涉到大小端问题. CPU的大端和小端模式很多地方都会用到,但还是有许多朋友不知道,今天暂且普及一下. 一.为什么会有大小端模式之分呢? 因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit. 但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的int型.另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何

Linux中判断大小端的一种方法

大小端的定义无需赘言,常用的方法有使用联合体和指针法,如: int checkCPU() { union w { int a; char b; }c; c.a = 1; return (c.b == 1); // 小端返回TRUE,大端返回FALSE } 实际上Linux操作系统的源码中,其判断更为简洁: static union { char c[4]; unsigned long mylong; } endian_test = {{ 'l', '?', '?', 'b' } }; #defi

计算机字节的大小端判断

最近在学习微机接口技术和网络编程基础,在这两门学科里都提到计算机字节的大小端判断问题 什么是大小端呢? 如果在连续的两个地址空a,a+1面存入一个占用这两个空间的整数.以十六位数为例 0x0102   如果a里面是01 则说明是大端存储  如果a里面是02则说明是小端存储 c语言代码: #include <stdio.h>union { short num; char num1[sizeof(short)];} un; int main(int argc,char **argv) { un.n