数据的存储(1):字节序与比特序

2023-05-16

前言

在计算机的发展过程中,由于不同硬件体系在数据高低有效位及存储方式理解上的差异,出现了大端和小端这两种截然相反的对数据的位进行解释的模式。大小端模式本身没有优劣之分,但我们在开发过程中,需要时刻考虑设备大小端差异可能会对程序带来的影响,其中最典型的就是字节序和比特序问题。

字节序

大多数计算机使用字节作为最小的可寻址的内存单元。对于多字节的数据,一般都会被存储为连续的字节序列,但是组成数据的字节在内存中的存放顺序不同,对于不同的硬件体系也会有不同的解释。通常字节序规则分为两种:

  • 小端法(little-endian):在内存中,数据按照最低有效字节到最高有效字节的顺序进行存储,即数据的高位字节在高地址处,低位字节在低地址处。大多数Intel体系下的机器都是使用的小端模式;
  • 大端法(big-endian):在内存中,数据按照最高有效字节存储到最低有效字节的顺序进行存储,即数据的高位字节在低地址处,低位字节在低地址处。通常网络字节序都是采用的大端法。

以一个简单的整型数0x12345678为例,可以查看其在使用小端法和大端法存储时的差异:
在这里插入图片描述

一般来说,机器的字节序对于上层应用完全是不可见的,程序编译时已经帮我们进行了处理,但是在一些特殊的场景中,典型的如在不同类型的机器之间传输数据时,就必须要考虑字节序差异的问题。

使用union确认系统的字节序

对于特定的硬件体系结构,使用的字节顺序基本都是确定的,Linux下可以使用lscpu命令进行查看。更通用的,我们可以自己编写程序使用union联合体来进行确认:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    union CheckEndianness{
        int i_val;
        char c_val;
    }endian = {0};

    endian.i_val = 1;

    printf("c_val is %d.\n", endian.c_val);

    return 0;
}

上述程序中,c_val的值始终存储于最低内存地址中。运行上述程序,如果c_val显示的结果为1,则说明当前机器是小端模式;若c_val显示的结果为0,则说明当前机器是大端模式。

比特序

字节序关注的是多字节数据的不同字节在内存中排列顺序,而比特序关注的是单个字节内bit的排列顺序。对于某个确定的计算机系统,比特序通常与字节序保持一致,即:

  • 大端模式:在大端系统中,数据每个字节的最高有效位(Most Significant Bit)存放在内存最低bit位处;
  • 小端模式:在小端系统中,数据每个字节的最低有效位(Least Significant Bit)存放在内存最低bit位处。

考虑一个最简单的单字节的数据0x34,在不同机器上的存储:
在这里插入图片描述
从图中可以看到,小端系统默认从内存的低比特位开始存储数据,而大端系统则从内存的高比特位开始存储。在大部分情况下,计算机系统已经隐式帮我们做了转换处理,只有在一些极特殊的场景下,比如使用位域,我们需要考虑比特序差异可能带来的影响。

大小端差异的本质

实际上,大端机器和小端机器区别的本质是由于处理器的数据引脚和系统地址总线的连接方向的不同,这导致了不同的机器会按照不同的方法来解释高低字节以及单个字节内的高低位顺序。在此我们以32位整型数0x12345678为例,查看多字节的数据在大端和小端机器上内存布局的差异:
在这里插入图片描述

我们可以看到内存中位的排列顺序后,大端和小端系统上,除了明显的字节排列上的差异,对于数据特定的某个字节在内存中的比特序列是完全相反的。在日常的数字书写规则中,我们一般都是从左到右进行书写,并且都是先写数字的高位再写低位,从这点上看,大端系统的表示更符合我们平常的书写习惯;而小端系统上,由于实际数据的高低有效位与内存bit的高低位是一致的,对于我们日常进行数据运算来说要更容易理解一些。

写在最后

在考虑字节序和比特序问题时,有一个简单的规则:在对数据进行整存整取时,此时不需要考虑序列的差异,系统默认会帮我们处理一切;但是在对数据进行零存整取或者整存零取时,就必须关注大小端可能会带来的差异。

相关参考

  • 《深入理解计算机系统》
  • 《计算机组成与体系结构性能设计》
  • 《Byte and Bit Order Dissection》
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据的存储(1):字节序与比特序 的相关文章

  • 如何使用VSCode编译调试C语言程序

    一 前言 Visual Studio Code可通过安装插件来支持C 43 43 C Python PHP等语言 xff0c 使用的工程师越来越多 xff0c 本文介绍如何使用VS Code进行C语言的编译与调试 二 安装VS Code V
  • 修改一个工作空间中的工程文件目录结构

    如果有两个工程 xff0c Test1 Test2 xff0c 那么 默认目录结构的是 Test1 dsw Test1 dsp Test2 Test2 dsp 这个结构不太清晰 xff0c 用过vc7或更高的朋友知道 xff0c 他们的目录
  • C语言50题之百度笔试题

    判断你的电脑存储方式是大端还是小端 大端模式 xff0c 是指数据的高字节保存在内存的低地址中 xff0c 而数据的低字节保存在内存的高地址中 xff0c 这样的存储模式有点儿类似于把数据当作字符串顺序处理 xff1a 地址由小向大增加 x
  • 关于C语言中return的总结

    return break和continue 这三个关键字有一个共同点 xff0c 那就是读能让后面的语句不执行 xff0c 不同的地方就是挑的距离不一样 return很强大 xff0c 如果一个函数中有一个return xff0c 并且执行
  • Windows下Cmake的简单使用

    一 安装Cmake 官网 xff1a https cmake org 本文以Windows64为例 二 项目目录如下 xff1a 1 新建demo文件夹 2 在demo文件夹下新建bin文件夹 HelloWorld cpp CMakeLis
  • Cmake的动态链接库dll的生成并测试

    一 项目任务 1 完成一个CMake工程生成一个动态库 xff0c 该动态库包含内容 xff1a 1 包含一个StringUtil类 xff0c 该类具有Split和Trim2个静态方法 上述2个接口的定义如下 xff1a 删除字符串两侧的
  • cmd/dos批处理脚本出错-is not recognized as an internal or external command

    cmd xff08 dos xff09 批处理脚本执行出现错误 xff1a is not recognized as an internal or external command xff0c 运行中断 脚本文件无语法错误 xff0c 编辑
  • CTF竞赛介绍及刷题网址更新---2020.08

    CTF xff08 Capture The Flag xff09 中文一般译作夺旗赛 xff0c 在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式 CTF起源于1996年DEFCON全球黑客大会 xff0c 以代替之前黑
  • VS2008与Matlab混合编程设置

    VS2008 与MATLAB R2009b 混合编程环境配置 一 xff0c VS2008 中的函数调用matlab的写好的函数 1 Matlab 生成 DLL 1 1 编译器的安装 实验环境 xff1a XP 32 位机MATLAB R2
  • System.console().readPassword() java.lang.NullPointerException

    java核心技术 卷I 书籍中有关 java io Console 类的1个示例 System console readLine 与 System console readPassword 在 idea 中运行出现 java lang Nu
  • Linux man中文手册的安装与使用

    概要 xff1a 在 ubuntu 20 04 中下载 安装使用 man 中文手册 文章目录 linux shell命令学习法宝 man 手册man中文手册的下载 安装及环境变量的配置下载安装环境变量配置及 cman 命令使用 man 中文
  • X window selection --- xclip

    原文 英文 url xff1a https encyclopedia thefreedictionary com X 43 Window 43 selection 本文为笔者的翻译 xff0c 红色部分为笔者增加的批注 文章目录 Activ
  • linux安装xclip实现终端与剪贴板之间的通道

    概要 xff1a ubuntu 20 04 通过安装 xclip 来实现终端与剪贴板之间的数据通道 xff1a xclip 类似 dos 中的 clip命令 xff0c xclip 可将命令执行的结果保存到剪贴板 xff0c 还允许将文件的
  • java中GBK与UTF-8编码的转换

    文章目录 java源文件中中文字符的编码的问题UTF 8和GBK格式的文件相互转换java实现文件编码的转换 java不同编码的字节数组的转换Java判断文件编码格式对于UTF 8格式文件的判断 xff1a 利用cpdetector开源库确
  • GBK编码表

    全国信息技术标准化技术委员会 汉字内码扩展规范 GBK Chinese Internal Code Specification 1 0 版 xff08 按编码顺序排列 xff09 其编码范围 xff1a 8140 xff0d FEFE xf
  • dll文件下载网址

    https cn dll files com
  • windows中dos命令汇总及获取管理员权限

    文章目录 windows 获取管理员权限的2种方式runas 用法 windows dos 命令行语法项windows dos命令总述 windows dos命令详细介绍 win7及以前 微软官网 windows dos命令详细介绍 win
  • windows比cmd更强大的 WMIC命令使用详解

    文章目录 什么是wmic WMIC能做什么 WMIC命令使用帮助文档WMIC命令使用实例wmic的运行方式可以有两种法1 显示进程的详细信息2 停止 暂停和运行服务功能3 显示出BIOS信息4 停止进程的操作5 连接远程电脑6 BIOS 基
  • 编程意识——宏定义封装多个函数参数

    作者 釜薪君 公众号 嵌入式杂牌军 文章目录 前言一 这种意识的来源二 实现源码分析1 函数调用2 宏定义部分3 函数实现4 宏替换后的函数调用 总结 前言 今天带小伙伴们分析一段不错的代码 xff0c 学习一下关于宏封装的一种意识 xff
  • DSP28335的SCI的FIFO中断使用心得

    自学了一段时间的DSP28335的串口设置 xff0c 写下来帮助更多的新手 xff0c 遇到了很多问题也记录一些解决办法 以下全都是我个人的理解 xff0c 可能说的不对 xff0c 大家讨论 1 关于为什么必须用FIFO 一般的DSP系

随机推荐

  • 51单片机堆栈深入剖析

    用C语言进行MCS51系列单片机程序设计是单片机开发和应用的必然趋势 Keil公司的C51编译器支持经典8051和8051派生产品的版本 xff0c 通称为Cx51 应该说 xff0c Cx51是C语言在MCS51单片机上的扩展 xff0c
  • 基于ros_arduino_bridge的智能小车----上位机篇

    基于ros arduino bridge的智能小车 上位机篇 基于ros arduino bridge的智能小车 硬件篇 基于ros arduino bridge的智能小车 下位机篇 ros arduino bridge文件系统 xff08
  • 基于ros_arduino_bridge的智能小车----下位机篇

    基于ros arduino bridge的智能小车 下位机篇 参考文章 xff1a 基于ros arduino bridge的智能小车 上位机篇 基于ros arduino bridge的智能小车 硬件篇 下位机部分实际上可以视作完全独立的
  • 【命令】Python执行命令超时控制【原创】

    目录 参考 概要 方案 方案一 xff1a os system 方案二 xff1a os popen 方案三 xff1a subprocess check output 方案四 xff1a subprocess Popen 方案五 xff1
  • nRF52 Mesh开发 (2) SDK例程Light_switch server 添加一个element控制开发板其他LED灯

    server文件结构 xff1a 使用SEGGER编译的话直接打开 emProject文件即可 xff1b img文件中包含程序运行过程图 xff1b include文件包含该例程下的头文件 xff1b 2 具体操作 xff1a 在main
  • nRF52 Mesh开发 (3) MESH Sensor Server/Client Models详解与实现

    MESH Sensor Model 实现 MESH Spec规定的 Sensor Model 标准传感器状态传感器描述传感器参数设置传感器cadence传感器数据 传感器可发送和接收的消息Sensor Server Client Model
  • Telink Mesh 开发(1)调试log打印

    Telink Mesh SDK 调试log打印 Telink 官网论坛建议使用GPIO模拟串口打印log xff0c 推荐阅读Telink官网发布的最新SDK使用手册 xff0c 更新了不少东西 一 使用串口打印log1 使能uart lo
  • 蓝牙Mesh基础(3)蓝牙Mesh协议--总览

    蓝牙Mesh协议 总览Bearer Layer xff08 承载层 xff09 Network Layer xff08 网络层 xff09 Low Transport Layer xff08 下层传输层 xff09 Upper Transp
  • 蓝牙Mesh基础(9)设备配网

    设备配网 xff08 启动配置 xff09 设备配网过程配网PDU配网PDU如何传输呢 设备配网过程 首先 xff0c 需要配网的设备先进行未配网广播 xff0c 这个广播不同于普通的ble广播 xff0c 广播数据结构类型 xff08 A
  • 弱网络环境模拟--树莓派搭建ATC

    弱网络环境模拟 树莓派搭建ATC 1 硬件和系统2 搭建过程3 遇到的问题1 Failed to start hostapd service Unit hostapd service is masked2 django python版本问题
  • OpenCV双目相机测距程序

    本文主要分享一个双目测距的实现程序 xff0c 用的bumblebee2相机 使用的OpenCV自带的BM算法 在OpenCV3中 xff0c StereoBM算法发生了比较大的变化 xff0c StereoBM被定义为纯虚类 xff0c
  • stm32 printf 串口输出

    在使用STM32调试时 xff0c 经常使用串口发送信息 xff0c 为了方便调试与串口发送信息 xff0c 用printf xff08 xff09 函数实现通过串口打印信息 1 添加包含printf xff08 xff09 函数的头文件
  • 【slighttpd】基于lighttpd架构的Server项目实战(7)—http-parser

    对于http服务器 xff0c http request的解析是比较麻烦的 xff0c 由于我们的重点并不在这上面 xff0c 所以这一部分不打算自己编写 xff0c 而是使用开源的http parser库 xff0c 下面我们将使用该库来
  • C#实现以图搜图

    朋友们 xff0c 如需转载请标明出处 xff1a http blog csdn net jiangjunshow 前言 最近在逛淘宝时发现了淘宝的图片搜索功能 xff0c 可能是我太Low了这个技术点已经实现很长时间了 想想自己能不能实现
  • 床长人工智能教程 - 前言

    朋友们 如需转载请标明出处 xff1a http blog csdn net jiangjunshow 人工智能被认为是一种拯救世界 终结世界的技术 毋庸置疑 xff0c 人工智能时代就要来临了 xff0c 科幻电影中的场景将成为现实 xf
  • 如何做接口测试呢?接口测试有哪些工具【小白都会系列】

    回想入职测试已经10年时间了 xff0c 初入职场的我对于接口测试茫然不知 后来因为业务需要 xff0c 开始慢慢接触接口测试 从最开始使用工具进行接口测试到编写代码实现接口自动化 xff0c 到最后的测试平台开发 回想这一路走来感触颇深
  • C++有限状态自动机解析HTTP协议

    一 HTTP请求报文格式 HTTP请求报文主要由四部分组成 xff0c 分别为请求头 请求行 空行 请求体 xff1b 请求方法 请求方法包括GET HEAD PUT POST TRACE OPTIONS DELETE等 xff1b xff
  • 解析URL

    简介 在github有轮子http parser解析器 小的就不再造轮子了 xff0c 哈哈 xff08 造这个轮子真不是一时半会的事 xff09 目前该解析器用于nodejs的http解析 xff0c 另还有大家熟知的tcpflow 以及
  • ubuntu 串口调试助手

    ubuntu 下的串口调试助手推荐有两个 PuTTY 和 CuteCom PuTTY 除了串口通讯功能外还有 SSH 和 Telnet 等功能 CuteCom 只能用于串口通讯 但串口界面更友好 安装串口工具 ubuntu 标准安装源中包含
  • 数据的存储(1):字节序与比特序

    前言 在计算机的发展过程中 xff0c 由于不同硬件体系在数据高低有效位及存储方式理解上的差异 xff0c 出现了大端和小端这两种截然相反的对数据的位进行解释的模式 大小端模式本身没有优劣之分 xff0c 但我们在开发过程中 xff0c 需