关闭

几行代码解决大端小端的问题

标签: 大端小端
4626人阅读 评论(0) 收藏 举报
分类:

  1. int checkcpu (void)
  2. {
  3. {
  4. union w
  5. {
  6. int  a;
  7. char b;
  8. }c;
  9. c.a = 1;
  10. return (c.b == 1);
  11. }
  12. }

根据返回值判断处理器是大端还是小端。

什么是高/低地址端

首先我们要知道C程序映像中内存的空间布局情况:在《C专 家编程》中或者《Unix环境高级编程》中有关于内存空间布局情况的说明,大致如下图:

----------------------- 最高内存地址 0xffffffff

栈底

栈顶

-----------------------


NULL (空洞)

-----------------------

-----------------------

未初始 化的数据

----------------------- 统称数据段

初始化的数据

-----------------------

正 文段(代码段)

----------------------- 最低内存地址 0x00000000

由图可以看出,再内存分布中,栈是向下增长的,而堆是向上增长的。

以上图为例如果我们在栈 上分配一个unsigned char buf[4],那么这个数组变量在栈上是如何布局的呢?看下图:

栈底 (高地址)

----------

buf[3]

buf[2]

buf[1]

buf[0]

----------

栈顶 (低地址)

其实,我们可以自己在编译器里面创建一个数组,然后分别输出数组种每个元素的地址,来验证一下。

1.2 什么是高/低字节

现在我们弄清了高/低地址,接着考虑高/低字节。有些文章中称低位字节为最低有效位,高位字节为最高有效位。如果我们有一个32位无符号整型0x12345678,那么高位是什么,低位又是什么呢? 其实很简单。在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是如此。就拿 0x12345678来说,从高位到低位的字节依次是0x12、0x34、0x56和0x78。

高/低地址端和高/低字节都弄清了。我们再来回顾 一下Big-Endian和Little-Endian的定义,并用图示说明两种字节序:

以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:

Big-Endian: 低地址存放高位,如下图:

栈底 (高地址)

---------------

buf[3] (0x78) -- 低位

buf[2] (0x56)

buf[1] (0x34)

buf[0] (0x12) -- 高位

---------------

栈顶 (低地址)


Little-Endian: 低地址存放低位,如下图:

栈底 (高地址)

---------------

buf[3] (0x12) -- 高位

buf[2] (0x34)

buf[1] (0x56)

buf[0] (0x78) -- 低位

--------------

栈 顶 (低地址)

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

文件输入输出中遇到的大端序和小端序问题

目录用 [TOC]来生成目录:目录 一 字节序 大端序和小端序 代码实现 测试字节序 二 C内存地址分配简介 三 CC内存区划分
  • dcplove
  • dcplove
  • 2015-09-01 11:33
  • 1077

【转】轻松记住大端小端的含义(附对大端和小端的解释)

转自:http://www.cnblogs.com/wuyuegb2312/archive/2013/06/08/3126510.html        或许你曾经仔细了解过什么是大端小端,也动手编...
  • firstlai
  • firstlai
  • 2015-11-18 20:50
  • 1472

C语言再学习-- 大端小端详解(转)

占楼
  • qq_29350001
  • qq_29350001
  • 2017-01-14 19:23
  • 3390

C中大端小端的问题

采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。union中可以定义多个成员,但union的大小由最大的...
  • zcyzsy
  • zcyzsy
  • 2016-08-12 00:33
  • 431

笔试面试7 如何判断一个系统的存储方式是大端还是小端

首先看下大小端的概念吧,我老是会有点乱... 来自百度百科的解释: 大端模式,是指数据的高位保存在内存的低地址中,而数据的低位保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处...
  • guang_jing
  • guang_jing
  • 2014-11-06 23:06
  • 1840

大端小端格式详解

1. 什么是大端,什么是小端: 所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中; 所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存...
  • zhaoshuzhaoshu
  • zhaoshuzhaoshu
  • 2014-07-09 16:30
  • 60689

大端模式和小端模式转化

在工作中遇到一个问题,数据是以大端模式存储的,而机器是小端模式,必须进行转换,否则使用时会出问题。 一、定义: 大端模式(Big Endian):数据的高字节,保存在内存的低地址中;数据的低字节,保存...
  • szchtx
  • szchtx
  • 2015-01-18 12:20
  • 15126

判断计算机是大端还是小端

介绍计算机有little endian(小端)和big endian(大端)之分,两张从 维基百科盗来的图就可以说明它们的区别:对于32位的整数,大端机器会在内存的低地址存储高位,在高地址存储低位。小...
  • lwfcgz
  • lwfcgz
  • 2016-01-07 14:22
  • 2387

对于字节序小端和大端的思考

从网上可以查到的大小端的解释,小端是低端数据存放在低端地址,大端是高端数据存在低端地址。大小端真的就这么简单吗,不是这样的。 可以这样理解: 对于小端处理器,如果要寻址一个word型数据,处理器首...
  • skyflying2012
  • skyflying2012
  • 2014-12-21 23:06
  • 3441

字节存储排序:大端和小端的判别及转换

当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题,于是端(endian)的问题应运而生了,对于不同的存储方法,就有大端(big-en...
  • u010193457
  • u010193457
  • 2016-09-14 22:43
  • 2882
    个人资料
    • 访问:521982次
    • 积分:5960
    • 等级:
    • 排名:第4971名
    • 原创:98篇
    • 转载:31篇
    • 译文:0篇
    • 评论:90条
    博客专栏
    最新评论