字节顺序与大小端

1.概念:

  1)小端:操作数的存放方式是高地址存放高字节。

  0x1234,存放地址为0x2000

  内存地址  存放内容

  0x2000    0x34

  0x2001    0x12

  2)大端:操作数的存放方式是高地址存放低字节。

    0x1234,存放地址为0x2000

  内存地址  存放内容

  0x2000    0x12

  0x2001    0x34

  x86平台采用的是小端模式,网络字节顺序是大端模式。

2.检测系统大小端

  1)调用库检测  

1 #include<endian.h>
2 #include<stdio.h>
3 int main()
4 {
5         printf ("big_endian:%d\nlittle_endian:%d\nmine_endian:%d\n",__BIG_ENDIAN,__LITTLE_ENDIAN,__BYTE_ORDER);
6         return 0;
7 }

  2)共用体检测:共用体字节存放顺序是所有成员都从低地址开始申请内存空间。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 union word
 4 {
 5         int a ;
 6         char b;
 7 }c;
 8 int checkCPU(void)
 9 {
10         c.a=1;
11         return (c.b==1);
12 }
13
14 int main()
15 {
16         int i;
17         i=checkCPU();
18         if(i==0)
19                 printf("Big endian.\n");
20         else if(i==1)
21                 printf("Little endian.\n");
22         return 0;
23 }

  

时间: 2024-08-04 12:39:55

字节顺序与大小端的相关文章

字节序与大小端

为什么会有字节序问题 1. 内存以8bit为一个地址单位:早期的处理器地址以8bit为一个单位(8位处理器),也就是说一次可以访问8bit的数据,后来出现了16位,32位甚至64位的处理器,但为了兼容最早的8位处理器,因此沿用8bit为一个地址单位. 2. 大于8位的处理器,如32位处理器,虽然每个8bit(一个字节)存储数据的方式是一样的,但是针对整形这样的有多个字节的数据结构的数据,每个字节内存储数据方式相同,但字节间(即几个字节的顺序)存储方式不同. 3.其他历史原因. 不同的处理器结构对

字节转换之大小端

今天有个任务是将字节文件转换成整型,我是采用C#的BinaryReader.ReadInt32来直接读取的,运行结果也很顺利,整型结果是1577,但是好奇心驱使我用Ultraedit打开了源文件,但是我发现16进制存储的数组是这样的 这是什么鬼-,读取结果: 0x29060000=0*16^0+0*16^1+0*16^2+0*16^3+6*16^4+0*16^5+9*16^6+2*16^7=688259072 这和1577完全不搭嘎啊,都溢出了- 于是乎问大牛,查资料,得知这是大小端问题,我的是

【转】[c/c++ ]字节序与大小端转换--不错

原文网址:http://blog.csdn.net/kuai0705/article/details/20841133 注明: 以下内容均为学习内容整理,记录,便于自己学习,并非完全意义上的自产,如有感到不适,请联系我 一.多字节值及字节序 1.brief 现在有一个数字 65430,这个数字在二进制的内存中一个字节无法完全存下,存储这个数字需要1个字节以上的空间.这样的值被称为多字节量(multi-byte quantity). 65430在内存中由两个字节表示:0xFF 和 0x96 ,其中

Linux程序设计学习笔记----网络编程之网络数据包拆封包与字节顺序大小端

网络数据包的封包与拆包 过程如下: 将数据从一台计算机通过一定的路径发送到另一台计算机.应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示: 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据包(packet),在链路层叫做帧(frame).数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理. 上图对应两台计算机在同一网段中的情况,

大小端字节顺序

字节序的问题涉及硬件架构,目前主要是Motorola的PowerPC系列CPU和Intel的x86系列CPU.PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据.那么究竟什么是big endian,什么又是little endian呢? 为方便理解,摘了INTER手册中的一张图.呵呵. 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序.小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内

大小端字节

1.概念 所谓大端小端,指的是对于多字节的数据类型(比如,int)在内存中存放的字节顺序.小端是指低地址的字节存放的是数据的低位,高地址字节存放的是数据的高位.大端是指低地址字节存放的是数据的高位,高地址字节存放数据的高位.简单地说,低位字节存放数据的高位就是大端,低位就是小端. 下面是一个例子,用来说明整数0x12345678在大端小端模式下不同的存放顺序. 内存地址 小端模式 大端模式 0x5250 0x78 0x12 0x5251 0x56 0x34 0x5252 0x34 0x56 0x

大端模式和小端模式 网络字节顺序与主机字节顺序

在 各种计算机体系结构中,对于字节.字等的存储机制有所不同,因而引发了计算机 通信领 域中一个很重要的问题,即通信双方交流的信息单元(比特.字节.字.双字等等)应该以什么样的顺序进行传送.如果不达成一致的规则,通信双方将无法进行正 确的编/译码从而导致通信失败.目前在各种体系的计算机中通常采用的字节存储机制主要有两种:Big-Endian和Little-Endian,下面先从字节序说起.一.什么是字节序字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的

(转)大小端模式详解

int i=1; char *p=(char *)&i; if(*p==1) printf("1"); else printf("2"); 大小端存储问题,如果小端方式中(i占至少两个字节的长度)则i所分配的内存最小地址那个字节中就存着1,其他字节是0.大端的话则1在i的最高地址字节处存放,char是一个字节,所以强制将char型量p指向i则p指向的一定是i的最低地址,那么就可以判断p中的值是不是1来确定是不是小端. 请写一个C函数,若处理器是Big_end

基于X86平台的PC机通过网络发送一个int(32位)整数的字节顺序

1.字节顺序 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序.小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处:大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处.计算机中读取数据的时候是从高地址到低地址,存储数据时候相反! 2.主机字节序到网络字节序 基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的.因而对int.uint16.uint32等多于1字节类型的数据,在这些嵌入式平台上应该变换其存储顺