813 字
4 分钟
信息的表示和处理:整数小数的存储

基本概念#

位,字节,字#

:计算机中最底层的二进制数字,1bit智能表示0或1

位组合:把位组合到一起,采用某种规则进行解读

8bit块:字节byte是最小的内存存储单元,可以表示2^8种可能的值,对于无符号可以表示0~255,有符号可以表示-128~127(符号需要占一个bit)

:CPU中ALU的数据位数,也就是CPU中通用寄存器的位数,决定 CPU 一次能处理的数据量。影响内存地址的寻址范围和指令集架构。

NOTE

对于汇编语言,一个字值是16位,1word=2byte=16bit

内存的结构与地址#

内存被视为一个巨大的 数组,其元素是一系列地址连续的 存储单元 组成,每个单元通常是 1 字节(8 位)。

元素的下标 称作 地址。一般是一串十六进制数,程序通过变量的地址访问和操作数据。

数据类型的大小决定了它占用的字节数(如 int 通常占 4 字节)。

数据在计算机中存储的时候是以位的形式存储的,利用showbyte函数可以展示变量在内存中的字节表示。每个字节以 十六进制 格式输出。

小端与大端#

计算机系统中存储多字节数据时,有两种不同方式:小端序(Little-endian)和大端序(Big-endian)。

  • 小端序:低位字节(右边)存储在低地址处,高位字节(左边)存储在高地址处。

    • 例如, 十六进制数 0x12345678 在小端序中存储为 低地址->78 56 34 12->高地址
  • 大端序:高位字节(左边)存储在低地址处,低位字节(右边)存储在高地址处。

    • 例如,十六进制数 0x12345678 在大端序中存储为 低地址->12 34 56 78->高地址

小端和大端并不影响数据的数值,只影响数据在内存中的存储顺序。

进制#

数的通用表示:基数(底),数码(数字),位,位权

基数就是k进制中的k,数码是0~k-1中的一个数码,位就是数码从右到左的位置(从0开始),位权是k的位幂次方,这样任何数都可以表示为:

N=±[ankn+an1kn1++a1k1+a0k0+b1k1+b2k2++bmkm]其中a1an,b1bm 是0~k-1中的一个数码N=\pm [a_n\cdot k^n+a_{n-1}\cdot k^{n-1}+\dotsc+a_1\cdot k^1+a_0\cdot k^0+b_1\cdot k^{-1}+b_2\cdot k^{-2}+\dotsc+b_m\cdot k^{-m}]\\ \text{其中$a_1\dotsc a_n,b_1\dotsc b_m$ 是0~k-1中的一个数码}

二进制#

基数是2,由0,1两个数码组成,各个位权用 2i2^i 表示 。

  • 0b是二进制的前缀标识。

十六进制#

基数为 16,数码使用 0–9 和 A–F 表示。(需要16个字符所以用字母凑数)

  • 16进制两位就可以表示一个byte,比01串更方便

  • 0x 是十六进制的前缀标识。

二进制转十六进制#

二进制和十六进制之间的转换就是查查表,每 1 位十六进制数 = 4 位二进制数。

十六进制二进制十六进制二进制
0000081000
1000191001
20010A1010
30011B1011
40100C1100
50101D1101
60110E1110
70111F1111
TIP

记住ACE,B=A+1,D=A+1,F=A+1

  1. 对二进制数从右往左每 4 位一组(不足 4 位在左侧补 0)

  2. 每组转换成对应的十六进制字符

    11010111 → 分组:1101 0111D70xD7

    101 → 补齐为 010150x5

    100110111001 → 分组:0001 0011 0111 100113790x1379

信息的表示和处理:整数小数的存储
https://biscuit0613.github.io/posts/csapp/csapp_byte/
作者
Biscuit
发布于
2025-10-10
许可协议
CC BY-NC-SA 4.0