[转] 大端序与小端序

PS: 大端序就是可读序(低地址放高位)(大端可读,大道至简)网络端用的是大端序,如发送一个消息,长度+“hello”

0x00, 0x00, 0x00,0x05, ‘h‘, ‘e‘, ‘l‘, ‘l‘, ‘o‘

何为大端序,小端序?

简单点说,就是字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序 了。注意字节序是硬件层面的东西,对于软件来说通常是透明的。再说白一点,字节序通常只和你使用的处理器架构有关,而和编程语言无关,比如常见的 Intel x86系列就是小端序。

Big-endian(大端序)

数据的高位字节存放在地址的低端 低位字节存放在地址高端

Little-endian(小端序)

数据的高位字节存放在地址的高端 低位字节存放在地址低端

字节的高位与低位
举个例子,int a = 0x12345678 ; 那么左边12就是高位字节,右边的78就是低位字节,从左到右,由高到低,(注意,高低乃相对而言,比如56相对于78是高字节,相对于34是低字节)

地址的高端与低端
0x00000001
0x00000002
0x00000003
0x00000004
从上倒下,由低到高,地址值小的为低端,地址值大的为高端。

不同字节序如何存储数据?

看看两种方式如何存储数据,假设从地址0x00000001处开始存储十六进制数0x12345678,那么

Bit-endian 如此存放(按原来顺序存储)
0x00000001           -- 12
0x00000002           -- 34
0x00000003           -- 56
0x00000004           -- 78

Little-endian 如此存放(颠倒顺序储存)
0x00000001           -- 78
0x00000002           -- 56
0x00000003           -- 34
0x00000004           -- 12

一个很好的记忆方法是,大端序是按照数字的书写顺序进行存储的,而小端序是颠倒书写顺序进行存储的。

编程判断大端序和小端序

方法一

bool IsBigEndian()
{
    int a =1 ;
    if(((char*)&a)[3] ==1)
        return true ;
    else
        return false ;
}

打开VS的内存窗口,看一下a的存储方式,一目了然

由于a是int,所以占四个字节,其值是00000001,存储方式如下。所以a[3]是0,不是大端序。一个更标准的写法是将a[3]替换为a[sizeof(int) - 1]。

0x0012FE88  01

0x0012FE89  00

0x0012FE8A  00

0x0012FE8B  00

方法二,使用union,原理见后面的面试题。

bool IsBigEndian()
{
    union
    {
        unsigned short a ;
        char b ;
    } c;

    c.a =0x0102 ;

    if(c.b ==1)
        return true ;
    else
        return false ;
}

一道面试题

来道题巩固一下,下面代码输出什么?

union u
{
    int i ;
    char x[2] ;
} a ;

int main(void)
{
    a.x[0] =‘1‘ ;
    a.x[1] =‘2‘ ;

    cout << a.i << endl ;

    getchar() ;
    return 0 ;
}

这个题,要看你使用的是什么系列的CPU,姑且假设是Intel系列的。Union是一个特殊的结构,其中所有成员共享结一个内存地址,任意时间只 能存储一个成员,上面的Union大小为4个字节,所以上面的代码存储完字符1和2之后,Union的存储貌似应该是0x31320000,31和32分 别是字符‘1‘和‘2‘的十六进制ASCII码(注意是字符1和2,而不是整数),但是Intel系列的CPU都是按照小端序存储的,所以,正确的顺序是 0x00003231,对应的十进制数是12849,你答对了么?

关于字节序的详细内容,请看Wikipedia的介绍 http://en.wikipedia.org/wiki/Endianness

== Happy coding ==

The End

时间: 2024-10-14 10:37:28

[转] 大端序与小端序的相关文章

如何判断是大端序,还是小端序

大端序:又叫网络字节序,是IBM公司主导的 小端序:又叫PC字节序,是Intel公司主导的. 如何判断是大端序还是小端序 低存低,高存高,(高太尉是小人),小端序, 低地址存高内容,高地址存低内容,是大端序

写程序判断系统是大端序还是小端序

大端是高位字节先存储(低地址) 小端是低位字节先存储(低地址) 网络字节序是大端的,也就是高位字节先传输 而int--char的强制转换,是将低地址的数值截断赋给char,利用这个准则可以判断系统是大端序还是小端序 #include <iostream> using namespace std; int main() { int a = 0x1234; char c = static_cast<char>(a); if (c == 0x12) cout << "

大端序和小端序

大端序和小端序 一般Intel处理器或者X86平台都是小端序 ,只有老一点的摩托罗拉处理器会用大端序,所以重点掌握一下小端序. 小端序一般指低地址存低字节,高地址存高字节...简称 "低低高高" 举个C语言的例子: #include<stdio.h> union u { int i; char j[2]; }a; void main() { a.j[0]='1'; a.j[1]='2'; printf("%x\n",a.i); } 因为联合体的几个变量共

大端序与小端序

何为大端序,小端序? 简单点说,就是字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序 了.注意字节序是硬件层面的东西,对于软件来说通常是透明的.再说白一点,字节序通常只和你使用的处理器架构有关,而和编程语言无关,比如常见的 Intel x86系列就是小端序. Big-endian(大端序) 数据的高位字节存放在地址的低端 低位字节存放在地址高端 Little-endian(小端序) 数据的高位字节存放在地址的高端 低位字

主机字节序和网络字节序(大端序,小端序,网络序)

根据cpu的不同我们可以把主机字节序在内存中存储的顺序叫做主机序,也就是我们常说的,大端机和小端机.我们经常看到的有两种: 1.小端机(内存中以小端序存储的机器):将低字节序存储在开始的地址(及内存较小的内存) 2.大端机(内存中以大端序存储的机器):将高字节序存储在开始的的地址 举个例子:我们将内存从左到右排列:在内存中存放0x01020304              2000     2001    2002     2003 小 : 04             03         0

判断机器大端序和小端序

//若处理器是Big_endian的,则返回0:若是Little_endian的,则返回1 //联合体union的存放顺序是所有成员都从低地址开始存放 //一个联合变量的长度等于各成员中最长的长度. //应该说明的是,这里所谓的共享不是指把多个成员同时装入一个联合变量内, //而是指该联合变量可被赋予任一成员值,但每次只能赋一种值,赋入新值则冲去旧值. int checkCPU( ) { union w { int a; char b; } c; c.a = 1; return(c.b ==1)

1、打印二进制机器码,程序内存分析,大端序小端序,指针数组,数组指针,数组的三种访问方式,typedef,#if-0-#endif,求数组大小,括号表达式

 1.打印二进制机器码(分别表示32位的和64位的) #include <stdio.h> /*按照8位的长度打印一个数值*/ void dis8bit(char val) { int bit = 8; while(bit--) { if(1<<bit&val){ printf("1"); } else { printf("0"); } if(!(bit%4)) printf(" "); } putchar(1

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

大端模式与小端模式 一.概念及详解 在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式. 先回顾两个关键词,MSB和LSB: MSB:Most Significant Bit  ------- 最高有效位     LSB:Least Significant Bit ------- 最低有效位 大端模式(big-edian) big-endian:MSB存放在最低端的地址上. 举例,双字节数0x1234以big-endia

大端法、小端法、网络字节序

关于字节序(大端法.小端法)的定义 <UNXI网络编程>定义:术语“小端”和“大端”表示多字节值的哪一端(小端或大端)存储在该值的起始地址.小端存在起始地址,即是小端字节序:大端存在起始地址,即是大端字节序.