当前位置: 首页 > news >正文

计算机中的数据表示

内容索引

  1. 数据结构
  2. 数据类型
  3. 数据宽度
  4. 数据表示
  5. 数字编码
  6. 字符编码
  7. 字节序

1. 数据类型与数据结构

基本数据类型是CPU可以直接进行运算的类型,以二进制的形式存储在计算机中

  • 整数型:byte, short, int, long
  • 浮点数:float, double
  • 字符型:char,用于表示各种语言的字母、标点符号、甚至表情符号等;
  • 布尔型:bool,用于表示“是”与“否”判断

基本数据类型提供了数据的“内容类型”,而数据结构提供了数据的“组织方式”

数据结构:数组与链表、栈与队列、哈希表、树、堆、图等

C语言基本数据类型大小 - x86架构(简)
  • 字符char的大小在C/C++中为1字节,
  • 在大多数现在操作系统中,1字节(byte)由8比特(bit)组成

2. 数据宽度

字节byte、字word、双字dword

  • 字(word)是一定数量的字节,所占位数取决于架构,x86架构的 1字 = 2字节 = 16 比特

3. 数据表示:位、字节、字

位 bit、字节 byte、字 WORD

在x86架构中:1 DWORD = 2字 = 4 字节 = 32 位(比特)

最低有效位LSB 是最右边的位

  • 最低有效位(Least Significant Bit,LSB)
  • 最高有效位(Most Significant Bit,MSB)是最左边的位
  • 当我们从二进制转换为十进制时,最高有效位会被乘以2的31次方,而最低有效位则会被乘以2的0次方;

4. 数字编码

原码(Sign-Magnitude)、反码(Ones' Complement)、补码(Two's Complement)

  1. 原码:用二进制数表示一个数,包括正负号。在原码中,最高位(最左边的位)是符号位,0 表示正数,1 表示负数。其余位表示数值本身。例如,十进制数 +5 的原码表示为0000 0101,而 -5 的原码表示为 1000 0101
  2. 反码正数的反码与其原码相同,负数的反码是对其原码除符号位外的所有位取反。例如,十进制数-5的反码表示为1111 1010。
  3. 补码:补码是计算机中最常用的表示方法,用于进行二进制加法运算。正数的补码与其原码相同,负数的补码是在其反码的基础上加1 。补码的一个重要特性是,任何数的补码加上该数本身,结果总是 0。例如,十进制数 -5 的补码表示为 1111 1011。

5. 字符编码

ASCII字符集, Unicode字符集, UTF-8编码

相关概念:“码点”、“基本多语言平面字符”

字符集:规定了每个字符和二进制数之间的对应关系,可以通过查表完成二进制数到字符的转换

码点:给字符分配的编号

  • ASCII码仅能够表示英文,最多能够表示128个不同的字符;
  • Unicode致力于将全球范围内的字符纳入统一的通用字符集中,理论上能容纳100多万个字符
    • UTF-8 是国际上使用最广泛的Unicode编码方法;
    • UTF-8 是一种变长的编码方法,有效提升了存储空间的使用效率;
    • UTF-16是一种等长的编码方法,但在编码中文时,UTF-16占用的空间比UTF-8更小;
    • Java和C#等编程语言默认使用 UTF-16,Microsoft的大部分技术都使用 UTF-16编码;
    • Python3.x使用灵活的Unicode表示方式(不是UTF-8或UTF-16),实际存储会根据字符串内容动态优化;
    • Go, Rust语言的string类型在内部使用UTF8编码
    • Unicode 包含15万左右个字符(截止2022年);

字符空间占用

  • ASCII字符:固定1字节
  • UTF-8:ASCII字符占1字节,中文占3字节。
  • UTF-16:基本多文种平面(BMP)字符占2字节,扩展字符(如emoji)占4字节。

*字符串如何在文件中存储或在网络中传输,与字符串在编程语言中的存储方式是不同的问题。在文件存储或网络传输中,通常会将字符串编码为UTF-8格式,以达到最优的兼容性和空间效率。

*逆向分析时,utf-8的字符理解为1字节,utf-16的字符一般理解为2字节;

字符编码核心概念区分

术语

定义

关键特性

ASCII字符集

7位编码标准(0-127),仅含英文、数字、基础符号及控制字符。

固定1字节/字符,共128字符。

Unicode字符集

国际统一字符集(最新版15.0),涵盖全球文字(如中文、阿拉伯文、emoji)。

抽象字符编号

UTF-8

Unicode的变长编码(1-4字节/字符),兼容ASCII。

ASCII字符占1字节,中文占3字节。

UTF-16

Unicode的定长/变长编码(2或4字节/字符),不兼容ASCII。

基本多文种平面(BMP)字符占2字节,扩展字符(如emoji)占4字节。

6. 字节序

大端序是最高有效字节在前,小端序则相反:

  • 比如 0x12345678, 大端序存储为 12 34 56 78,小端序存储为 78 67 34 12

大端序的使用场景

  • 网络协议:如 TCP/IP 使用大端序作为标准(“网络字节序”),例如 IP 地址和端口号的传输;
  • 文件格式:某些文件格式(如 JPEG、PNG)使用大端序存储数据;
  • 处理器架构:PowerPC、SPARC 等架构默认采用大端序

小端序的使用场景

  • x86/x86_64 架构:Intel 和 AMD 的处理器默认使用小端序,因此Windows,Linux 系统常见为小端序;
  • 嵌入式系统:如 ARM 处理器通常支持小端序模式;
  • 文件格式:如 Windows 的 PE 文件(可执行文件)和某些二进制协议(如 USB 数据包)

python struct模块中,小端序的格式字符是 <

  • 示例:strcut.pack('<I', 0x12345678),会生成 b'\x78\56\34\12'
  • struct 模块的格式化字符串对应的类型字符:
    • I 无符号整型(4 字节),unsigned int
    • L 无符号长整型(4 字节),unsinged long

参考引用

Hello算法对理解计算机表示、基本数据类型和数据结构很有帮助,有以前没有思考过的角度和视野,十分推荐阅读:

[1] 3.2   基本数据类型 - Hello 算法

[2] 3.4   字符编码 * - Hello 算法

http://www.dtcms.com/a/300062.html

相关文章:

  • C++ TAP(基于任务的异步编程模式)
  • 停止所有docker容器的命令
  • 【SSM】第二章 网上蛋糕项目商城-首页
  • 进程线程协程深度对比分析
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 71(题目+回答)
  • HarmonyOS应用上架流程详解
  • element-plus安装以及使用
  • STM32概况
  • Matlab自学笔记六十五:解方程的数值解法(代码速成)
  • 如何查看电脑后门IP和流量?
  • ECSPI控制器
  • 【Spring AI】SiliconFlow-硅基流动
  • 如何使用Anaconda(miniconda)和Pycharm
  • 宝塔面板如何升级OpenSSL
  • LED滚动字幕投射器:免费好用的字幕工具
  • [硬件电路-91]:模拟器件 - 半导体与常规导体不一样,其电阻式动态变化的,浅谈静态电阻与动态电阻
  • 倍思鹿数值仿真-实现设备型号库的可编辑、便捷导入项目
  • python I 本地 html 文件读取方法及编码报错问题详解
  • 【坐车n次最少钱】2022-8-31
  • Python项目结构与打包工具实践
  • java测试题(下)
  • 创意竖状滚动轮播图
  • 嵌入式硬件篇---zigbee无线串口通信问题
  • 【科普】ESP8266 连接 OneNet 平台传输数据与 4G 模块传输数据在多个维度存在显著区别,主要体现在以下几个方面:
  • 802.11系列无线局域网标准详细对比
  • buuctf_一叶障目_just a rar_snack
  • golang实现一个规则引擎,功能包括实时增加、修改、删除规则
  • 基于springboot的图书借阅系统
  • AI Agent开发学习系列 - LangGraph(1): 用LangGraph创建我们的第一个Agent
  • 最终一致性VS顺序一致性VS线性一致性(了解)