这几天在公司的内部讨论中提到了大小端的问题,在网上的跟多资料中有很多关于大小端的介绍,在此我以博客的形式记录自己这次的学习,供大家参考。
首先大小端问题的来源是由于操作系统中存储是以字节为单位存储的,那么大于一个字节的类型int、long等类型自然就会涉及到字节之间排序的问题。
一、概念
1、大端模式
所谓的大端模式,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
2、小端模式
所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
二、代码例程分析
在此,我贴一段我写的测试代码
#include <string.h> #include <stdio.h> int main() { int i = 0x12345678; char* c = (char*)&i; printf("c[0]=%0x---c[1]=%0x---c[2]=%0x---c[3]=%0x\n", c[0], c[1], c[2], c[3]); printf("c[0]=%0x---c[1]=%0x---c[2]=%0x---c[3]=%0x\n", &c[0], &c[1], &c[2], &c[3]); printf("c=%x-----*c=0x%x\n", *c, c); printf("*i=0x%x\n", &i); return 0; }
以下为显示结果,(注:此程序在ubuntu 16.04 gcc 5.4 运行)
c[0]=78---c[1]=56---c[2]=34---c[3]=12 c[0]=260c94c---c[1]=260c94d---c[2]=260c94e---c[3]=260c94f c=78-----*c=0x260c94c *i=0x260c94c
由此可以发现 i 的高地址存放的是‘0x12’,同时我们知道‘0x12’是数据的高位; 低地址存放的是‘0x78’,‘0x78’是数据的低位,因此我们得出ubuntu 是小端模式。
在此,我补充一个数据在内存中的存放问题,首先我们应该知道在内存中'栈'结构中内存是从高地址到低地址扩展的,也就是在此例中内存中的写入的第一个字节是'0x12'
这次记录就到此为止,欢迎各种互动。