1. 历史故事

《格列佛游记》

2. 概述

2.1

计算中的大端与小端描述的对象是字节,而不是位。同时,我们规定,计算机中的位编号在最右端从0开始,向左递增,对于四个字节32位来说,地址的编号是这样的:

2.2

让我们先将注意力放到字节上。big-endian(大端)格式存储数字的方式与我们的惯用法相同,最高有效数字从左开始,little-endian(小端)格式从左开始存储最低有效位数字。对于十六进制数字0x0165,大端存储为0165,而小端存储为6501。

x86以及x86-64采用的是小端格式,绝大部分PC以及服务器都是使用这种架构的cpu,制造商包括intel和amd。而ARM处理器可以自行设置大端或者小端。

实验环境:windows 10 + intel cpu + visual studio

我们在vs下写下如下代码

int main()
{int a = 0x00100110;a = 0x01100110;return 0;
}

在a = 0x1100110上打断点,然后启动调试器,并打开内存窗口:

这里的a = 0x00 10 01 10,注意这里是16进制,每2个数字占1个字节。可以看到,内存窗口中的地址从上到下递增,变量a的地址从0x000000E3F1FAFC24到0x000000E3F1FAFC27。而最高位地址保存的是我们数据的最高位,最低位地址保存的是数据的高低位,即0x000000E3F1FAFC27保存了数据的高位00,而0x000000E3F1FAFC24保存了数据的低位10。再回来看我们的变量a=0x00 10 01 10。从人类的习惯来看,从高到低是从左到右的,所以00是高字节,10是低字节,从而我们可以得出如下结论:

将最高字节放在最低位地址,这种顺序叫大端格式;

将最高字节放在最高位地址,这种顺序叫小端格式;

现在回过头来看上面的0x01 65,01是高字节,而65是低字节。当我们从内存的低地址看到高地址时,小端看到的就是6501,而大端看到的就会是0165。

2.3

现在让我们来思考另一个问题,我们知道一个int占4个字节。那么要怎么取出一个int中的高16位与低16位呢?

首先,我们说一个int中的高16位与低16位是对人类而言的,如对一个整数b = 0x 12 34 56 78,12 34就是高16位,56 78就是低16位。对小端而言,取高16位就是进行右移16位的运算,即 b >> 16,取低16位就是左移16位,即b << 16。这是与人的习惯相符的。而如果使用大端存储,那么应该进行相反的操作。

3. 实战

3.1 windows上转换大小端

相关函数名:

htonl、htons、ntohl、ntohs

3.2 linux上转换大小端

linux上也包含相关的htonl、htons、ntohl、ntohs,同时还提供了额外的头文件endian.h,相关函数名为htobe64, htobe32等。

计算机中的大端与小端相关推荐

  1. Java中的大端和小端

    Java整型的字节序是() A.Little-Endian(小端) B.Big-Endian(大端) C.由运行程序的CPU决定 D.由编译程序的CPU决定 对于大小端,我估计肯定有很多开发人员跟我一 ...

  2. java 为什么用大端_Java中的大端和小端

    Java整型的字节序是() A.Little-Endian(小端) B.Big-Endian(大端) C.由运行程序的CPU决定 D.由编译程序的CPU决定 对于大小端,我估计肯定有很多开发人员跟我一 ...

  3. C语言判断计算机存储是大端还是小端

    计算机的一个int型数据是用多个字节表示的,如果在内存中存放时标称该数据的地址中存放的是数据的最低字节,就叫小端机,反之把高字节存放在标称地址中的则称为大端机.所以可以定义一个int变量,将其地址强制 ...

  4. 网络编程中的大端和小端

    将低序字节存储在内存的起始地址,这称为小端字节序. 将高序字节存储在内存的起始地址,这称为大端字节序. 检查大小端字节序的简单代码如下: int main(int argc, char **argv) ...

  5. 彻底弄懂计算机中的大端小端

    大端与小端这个问题在做和其他设备交换原始字节数据的时候是非常重要的概念,也是必须要掌握的内容,但是很多人就是仅仅是稍微有些了解,但每次真正去做东西的时候,还是要花半天去想,博主就是这样的人,出现这样问 ...

  6. Java中大端、小端和>>运算符

    下面对java中的大端.小端和>>运算符进行整理记录. 字节序,指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序,有大端和小端两种方式: 大端:指高位字节存放在内存的低地址端, ...

  7. mysql是大端小端_大端和小端 - HackerVirus - 博客园

    在计算机中是以字节为单位,每个地址对应一个字节,一个字节8bit.在C中,除了8bit的char以外,还有16bit的short,32位的int,64位long,当然具体要由编译器决定,可以通过siz ...

  8. 大端和小端传输字节序

    大端和小端 在计算机中是以字节为单位,每一个地址对应一个字节,一个字节8bit.在C中,除了8bit的char以外,还有16bit的short,32位的int,64位long,当然具体要由编译器决定, ...

  9. 大端与小端:显示、存储和读取

    在文章<大端与小端>中,简单介绍了什么是大端与小端.就像打碎鸡蛋一样,你可以从大的那头打,也可以从小的那头打,但是鸡蛋还是那个鸡蛋.数据也是一样,你要么从高位存储或传输,要么从低位存储或传 ...

最新文章

  1. mysql行锁加在什么上_mysql怎么加行锁?
  2. dll文件32位64位检测工具以及Windows文件夹SysWow64的坑
  3. 皮卡丘为什么不进化_皮卡丘为啥不进化成雷丘?小智都暗示得这么明显皮卡丘还是拒绝了...
  4. Struts2、Spring3、MyBatis3整合ExtJS,完成ColumnTree 【一】
  5. 传输设备,光端机的应用及故障分析
  6. [gstreamer][001] Seek issues and so on
  7. [转]最常用的15大Eclipse开发快捷键技巧
  8. 在宝塔php里留后门,揭秘PHP的一种新型留后门方式
  9. Markdown数学公式大全
  10. 使用appium时出现的问题
  11. springmvc执行原理(基于组件)
  12. python基础: 选择语句
  13. js的this作用域
  14. Excel怎么快速选中相同背景颜色单元格
  15. 有人痴狂,有人跑路,开源软件新一年的冰火两重天
  16. Linux#Shell#if [ $# -ne 1 ];then 是什么意思?
  17. 【PHP编程】WebCat,手机搭建PHP运行环境及项目运行
  18. 深度学习入门系列1:多层感知器概述
  19. LSM tree(日志结构合并树)_笔记
  20. 【实战】AI 怎么打麻将?

热门文章

  1. C++高阶 聚合类型和聚合类
  2. 学系统集成项目管理工程师(中项)系列19b_成本管理(下)
  3. POI之HSSF,XSSF,SXSSF,PDF循环写入分页
  4. 基于OPC协议的上位机PLC通讯 (一)
  5. 半入耳式蓝牙耳机评测:南卡蓝牙耳机和FIIL哪个更好?
  6. 成都python培训中心哪家好?学费是多少?
  7. JavaScript中onload事件
  8. 【填坑】ESP32 bootloader初探(上)
  9. 0基础学习VR全景平台篇第38章:场景功能-AI虚拟人实操完整教程
  10. 日本推供牙医实习女性机器人 逼真治疗情景