简介

在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。考虑一个short整数0xAF32(0x32是低位,0xAF是高位),把它赋值给一个short变量,那么它在内存中的存储可能有如下两种情况:

  • 大端字节(Big-endian):较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。
  • 小端字节(Big-endian):字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。
    地址    0x2000  0x2001+-+-+-+-+-+-+-+-+
    大端存储 |  0xAF |  0x32 |+-+-+-+-+-+-+-+-+
    小端存储 |  0x32 |  0xAF |+-+-+-+-+-+-+-+-+
    

C函数判断大小端

判断计算机的存储方式:

// 是小端模式则返回1,否则返回0
int is_little_endian()
{union w{int x ;char y ;}c ;c.x = 1;return (c.y==1);
}

大端模式和小端模式转换

#include<stdio.h>typedef unsigned int uint_32 ;
typedef unsigned short uint_16 ;#define BSWAP_16(x) \(uint_16)((((uint_16)(x) & 0x00ff) << 8) | \(((uint_16)(x) & 0xff00) >> 8) \)
#define BSWAP_32(x) \(uint_32)((((uint_32)(x) & 0xff000000) >> 24) | \(((uint_32)(x) & 0x00ff0000) >> 8) | \(((uint_32)(x) & 0x0000ff00) << 8) | \(((uint_32)(x) & 0x000000ff) << 24) \)uint_16 bswap_16(uint_16 x)
{return (((uint_16)(x) & 0x00ff) << 8) | \(((uint_16)(x) & 0xff00) >> 8) ;
}
uint_32 bswap_32(uint_32 x)
{return (((uint_32)(x) & 0xff000000) >> 24) | \(((uint_32)(x) & 0x00ff0000) >> 8) | \(((uint_32)(x) & 0x0000ff00) << 8) | \(((uint_32)(x) & 0x000000ff) << 24) ;
}
int main(int argc,char *argv[])
{printf("------------带参宏-------------\n");printf("%#x\n",BSWAP_32(0x12345678));printf("%#x\n",BSWAP_16(0x1234)) ;printf("------------函数调用-----------\n");printf("%#x\n",bswap_32(0x12345678));printf("%#x\n",bswap_16(0x1234)) ;return 0 ;
}

两种模式的使用现状

Intel的80x86系列芯片是唯一还在坚持使用小端的芯片,ARM芯片默认采用小端,但可以切换为大端;而MIPS等芯片要么采用全部大端的方式储存,要么提供选项支持大端——可以在大小端之间切换。另外,对于大小端的处理也和编译器的实现有关,在C语言中,默认是小端(但在一些对于单片机的实现中却是基于大端,比如Keil 51C),Java是平台无关的,默认是大端。在网络上传输数据普遍采用的都是大端。

#include <stdio.h>
struct ST{short val1;short val2;
};
union U{int val;struct ST st;
};int main(void)
{int a = 0;union U u1, u2;a = 0x12345678;u1.val = a;printf("u1.val is 0x%x\n", u1.val);printf("val1 is 0x%x\n", u1.st.val1);printf("val2 is 0x%x\n", u1.st.val2);printf("after first convert is: 0x%x\n", htonl(u1.val));u2.st.val2 = htons(u1.st.val1);u2.st.val1 = htons(u1.st.val2);printf("after second convert is: 0x%x\n", u2.val);return 0;
}

shell命令判断大小端模式

  • dpkg-architecture命令

    $ dpkg-architecture
    DEB_BUILD_ARCH=arm64
    DEB_BUILD_ARCH_ABI=base
    DEB_BUILD_ARCH_BITS=64
    DEB_BUILD_ARCH_CPU=arm64
    DEB_BUILD_ARCH_ENDIAN=little
    DEB_BUILD_ARCH_LIBC=gnu
    DEB_BUILD_ARCH_OS=linux
    DEB_BUILD_GNU_CPU=aarch64
    DEB_BUILD_GNU_SYSTEM=linux-gnu
    DEB_BUILD_GNU_TYPE=aarch64-linux-gnu
    DEB_BUILD_MULTIARCH=aarch64-linux-gnu
    DEB_HOST_ARCH=arm64
    DEB_HOST_ARCH_ABI=base
    DEB_HOST_ARCH_BITS=64
    DEB_HOST_ARCH_CPU=arm64
    DEB_HOST_ARCH_ENDIAN=little
    DEB_HOST_ARCH_LIBC=gnu
    DEB_HOST_ARCH_OS=linux
    DEB_HOST_GNU_CPU=aarch64
    DEB_HOST_GNU_SYSTEM=linux-gnu
    DEB_HOST_GNU_TYPE=aarch64-linux-gnu
    DEB_HOST_MULTIARCH=aarch64-linux-gnu
    DEB_TARGET_ARCH=arm64
    DEB_TARGET_ARCH_ABI=base
    DEB_TARGET_ARCH_BITS=64
    DEB_TARGET_ARCH_CPU=arm64
    DEB_TARGET_ARCH_ENDIAN=little
    DEB_TARGET_ARCH_LIBC=gnu
    DEB_TARGET_ARCH_OS=linux
    DEB_TARGET_GNU_CPU=aarch64
    DEB_TARGET_GNU_SYSTEM=linux-gnu
    DEB_TARGET_GNU_TYPE=aarch64-linux-gnu
    DEB_TARGET_MULTIARCH=aarch64-linux-gnu
    
  • lscpu命令
    $ lscpu
    Architecture:        aarch64
    Byte Order:          Little Endian
    CPU(s):              4
    On-line CPU(s) list: 0-3
    Thread(s) per core:  1
    Core(s) per socket:  4
    Socket(s):           1
    Vendor ID:           ARM
    Model:               4
    Model name:          Cortex-A53
    Stepping:            r0p4
    CPU max MHz:         1296.0000
    CPU min MHz:         408.0000
    BogoMIPS:            48.00
    L1d cache:           unknown size
    L1i cache:           unknown size
    L2 cache:            unknown size
    Flags:               fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
    

延伸阅读:

准确详解:C/C++ float、double数据类型的表示范围及精度

大端小端模式判断以及数据转换相关推荐

  1. 大端模式和小端模式判断

    编写一个函数,判断处理器是Big_Endian的,还是是Little_Endian Big_Endian(大端)和Little_Endian(小端)的定义如下: a)Litte_Endian 就是低位 ...

  2. 大端小端模式以及相互转化

    文章目录 概念 转化方法 应用 概念 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中.(Big-Endian) 小端模式,是指数据的高字节保存在内存的高地址中,而数 ...

  3. 大端小端模式(俗称大尾小尾模式)

    转自百度百科 http://baike.baidu.com/link?url=uKVPtSaiXzEAXJSHfiya1Wj_oITw-t8MpHkJxJvMb0Eu_WXo28czAHLY-FOqj ...

  4. 大端小端模式及其判别方式

    Little endian 和Big endian 是CPU 存放数据的两种不同顺序. 对于整型.长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据 ...

  5. 计算机是小端模式,计算机内的大小端模式

    一.什么是大端与小端模式? 大端模式英文叫Big-Edian,小端模式英文叫little-Endian. 简单说: 大端模式:低字节存放在内存的低地址,高字节存放在内存的高地址(跟我们的一般思维相一致 ...

  6. 如何判断小端模式和大端模式

    用指针判断大小端 #include<stdio.h> int main(void) {int a = 1;char b = (*(char *)(&a));if(1 == b){p ...

  7. 判断单片机MCU是大端还是小端模式

    最近用杰理AC6966B调试博通的BK9527 U段发射芯片,一直没调通,经过测试IIC通讯是通,硬件还是好的,但是怎么都调不到与接收端成功连接. 最后咨询原厂得知提供的demo代码是大端编码模式的M ...

  8. 大端小端存储模式详解及判断方法

    文章目录 大小端模式的概念 两种模式出现原因 两种模式的优劣 大小端的应用情景 判断机器的字节序 大小端模式的概念 当我们查看数据在内存中的存储情况时,我们经常会发现一个很奇怪的现象,什么现象呢? i ...

  9. 大端模式与小端模式的理解以及判断方法

    1. 为什么会有大端模式和小端模式 在计算机中,我们知道数据是按照字节存储的,如果数据都是单字节存储,就不涉及存储顺序的问题.但是,大多数情况下,数据不是按照单字节的方式存储的,例如会有类似于int, ...

最新文章

  1. 【python】使用python脚本将LFW数据中1672组同一个人多张照片拷贝出来
  2. ubuntu中使用apt命令安装ipython失败解决方案
  3. SpringMvc+ajax实现文件跨域上传
  4. .NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper
  5. RGB to HSB or RGB to HSL
  6. Daily Scrum 11.18
  7. 从前端html 来限制删除去掉csdn页面广告
  8. 湖南计算机软件水平考试,2021年湖南省计算机软考职称考试 网络工程师 信息系统项目管理师报名考试...
  9. c7中取4c语言编程软件,c语言编程软件_C语言编程
  10. C#软件授权、注册、加密、解密模块源码解析并制作注册机生成license
  11. 远程重启h3c路由器_梅林路由怎么开启远程访问
  12. 如何选择合适的数据可视化BI工具
  13. 线段树(SegmentTree)学习笔记
  14. html表格两种颜色,html – 表格细胞两个颜色背景对角线
  15. 深度 ghost xp3 装IIS 方法
  16. php中文歌词,酷狗krc歌词解析并转换为lrc歌词php版
  17. 疯狂Java讲义(六)----第三部分
  18. imagej得到灰度图数据_Java图像处理最快技术:ImageJ 学习第一篇
  19. 全球与中国高炉系统(钢铁厂)市场深度研究分析报告
  20. t检验怎么分析结果python_使用python 批量 配对t检验 医学 基础研究 数据分析

热门文章

  1. php mysql倒计时_php 倒计时程序
  2. qfile指定从多少行开始_大牛进化路上之Linux基础命令,看看你了解多少?
  3. post获取重定向的链接 python_欧美音乐网站Python爬虫项目实战
  4. python弹出窗口后卡死_python的tkinter模块GUI编程为啥用了while循环之后就会使得程序出现卡死未响应崩溃?...
  5. vba php,VBA
  6. post大小限制_作为一个程序员,面试中常问的get和post的区别,你真的知道吗
  7. 排序算法 --- 堆排序
  8. php添加填空,PHP之preg_replace_callback(),将填空题的[[]]替换成______
  9. ios 贝塞尔曲线 颜色填充_iOS贝塞尔曲线(UIBezierPath)的基本使用方法
  10. 手机端使用ghelper_Anki手机端使用指南(一)