【原创】大端和小端字节序的细节

  这已经是一个被说得很烂的一个话题了,今天我想在这一篇文章补充一些细节上的东西,供备忘!

  在看这篇文章之前,请先仔细看下链接这篇博文,关于字节序说得很详细!http://blog.chinaunix.net/uid-25367385-id-188322.html

  在今天,碰到了这样一条语句:

#define get16bits(d) (*((const uint16_t *) (d)))

  很明显宏参数d必须是一个指针,它可以是位数大于等于16位的类型指针,short int、long int,甚至是float或double,只要有需求就可以。

 1 #include "stdio.h"
 2
 3 typedef unsigned short uint16_t;
 4 #define get16bits(d) (*((const uint16_t *) (d)))
 5
 6 int _tmain(int argc, _TCHAR* argv[])
 7 {
 8     //如果为小端字节序,那么读出来的是0x0001;如果为大端字节序,读出来的是0xFFFFF
 9     int d = 0xFFFF0001;    //int占4个字节
10     int *p = &d;
11     uint16_t a = get16bits(p);
12     printf("%d", a);
13     return 0;
14 }

  为什么上面的代码在不同的机器上面可能会得到不同的结果呢?

  下面将解释为什么CPU为小端字节序时,读出来的是0x0001。

  这一篇文章,唯一想说的是p指向的是d所在内存单元的最低地址而已!

  

  小端字节序的机器在存储0xFFFF0001这4个字节的数据时,它是按照上面的形式存储的。

  在代码中(*((const uint16_t *) (p))),p被转化成指向16位的整形指针,此时对这16位的整形指针解引用,它读出来的也就是16位数据,而不是原来的32位了,这也就是指针类型转换的作用了。我们假设p指针指向的是内存单元的高地址,那么小端字节序的机器读出来会是0xFF,所以这一假设是错误的,p指针指向的是内存单元的低地址!

  总结一下:在讲解字节序的同时,也要注意强调指针是指向内存单元低地址,否则有时会引起一些误解。

  本文链接:http://www.cnblogs.com/cposture/p/4490828.html

时间: 2024-10-10 16:22:01

【原创】大端和小端字节序的细节的相关文章

大端、小端字节序

int var=0x10203040; char by[4]; by=(char*)(&var); 则: by[0]=0x40, by[1]=0x30, by[2]=0x20, by[3]=0x10--小端,记忆规则:高高,低低. by[0]=0x10, by[1]=0x20, by[3]=0x30, by[3]=0x40--大端,记忆规则:高低,低高. 备注:大端中,数字就像字符串一样从左向右存储进内存中.网络字节序均为大端,因为在网络中,网卡先接收的字节存储进低内存,网络发送也是由内存从低到

小端字节序与大端字节序

端模式分为:小端字节序和大端字节序,也就是字节在内存中的顺序. 小端字节序:低字节存于内存低地址:高字节存于内存高地址.如一个long型数据0x12345678 0x0029f458 0x78 0x0029f459 0x56 0x0029f45a 0x34 0x0029f45b 0x12 在以上数据存放于内存中的表现形式中,0x0029f458 < 0x0029f459 < 0x0029f45a < 0x0029f45b, 可以知道内存的地址是由低到高的顺序:而数据的字节也是由低到高的,

内存对齐,大端字节 &nbsp; 序小端字节序验证

空结构体:对于空结构体,就是只有结构体这个模子,但里面却没有元素的结构体. 例: typedef struct student { }std: 这种空结构体的模子占一个字节,sizeof(std)=1. 柔性数组: 结构体中最后一个元素可以是一个大小未知的数组,称作柔性数组成员,规定柔性数组前面至少有一个元素. typedef struct student { int i; char arr[];     //柔性数组成员 }std: sizeof(std)=4; sizeof求取该结构体大小是

大端字节序和小端字节序之分

我们知道关于字节序有大端和小端之分.一般来说,Inter的处理器使用的是小端(little Indian),Moto的处理器使用的是大端.大端和小端的区别在于,内存对于变量的存放规则不同.小端存储模式是低位放在低地址,高位存放在高地址.而大端则相反. 简单示例如下: a=0x11223344: 低                                                             高 地址由低到高--------------------> 小端字节序    

内存对齐 大端字节,序小端字节序验证

空结构体:对于空结构体,就是只有结构体这个模子,但里面却没有元素的结构体. 例: typedef struct student { }std: 这种空结构体的模子占一个字节,sizeof(std)=1. 柔性数组: 结构体中最后一个元素可以是一个大小未知的数组,称作柔性数组成员,规定柔性数组前面至少有一个元素. typedef struct student { int i; char arr[];     //柔性数组成员 }std: sizeof(std)=4; sizeof求取该结构体大小是

linux kernel如何处理大端小端字节序

最近在做将kernel由小端处理器(arm)向大端处理器(ppc)的移植的工作,现在kernel进入console稳定工作,基本工作已经完成,不过移植中有很多心得还是需要总结下,今天先将kernel对于大小端字节序的处理来总结下. 之前写过大小端字节序的思考,文章链接地址:http://blog.csdn.net/skyflying2012/article/details/42065427. 根据之前的理解,字节序可以认为是处理器主观的概念,就像人如何去看待事物一样,处理器分大端和小端,对于内存

小端字节序和大端字节序

端模式分为:小端字节序和大端字节序,也就是字节在内存中的顺序. 需要注意的是,对于数据来说,高字节是指最高位字节,即左边第一位! 小端字节序:低字节存于内存低地址:高字节存于内存高地址.如一个long型数据0x12345678 0x0029f458 0x78 0x0029f459 0x56 0x0029f45a 0x34 0x0029f45b 0x12 在以上数据存放于内存中的表现形式中,0x0029f458 < 0x0029f459 < 0x0029f45a < 0x0029f45b,

大端字节序和小端字节序

不同的系统,对于存储的内容的高字节,可能分别放在物理地址的高地址或低地址. 我们可以简单地将内存看成是线性的连续地址. 对于高字节存放在低地址的字节序,称为大端字节序.网络字节序就是大端字节序. 反之,高字节存放在低地址的字节序,称为小端字节序. bool isLittleEndian() { int i = 1; char *a = (char*)&i; return *a;// 若true 小端字节序:反之 大端字节序 } 例子: #include <iostream> using

理解字节序 大端字节序和小端字节序

1. 计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian). 举例来说,数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11. 大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法. 小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存. 同理,0x1234567的大端字节序和小端字节序的写法如下图. 2. 我一直不理解,为什么要有字节序,每次读写都要区分,多麻烦!统一使用大端字节序,不是更方便吗?