基本概念
位,字节,字
位:计算机中最底层的二进制数字,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的位幂次方,这样任何数都可以表示为:
二进制
基数是2,由0,1两个数码组成,各个位权用 表示 。
0b是二进制的前缀标识。
十六进制
基数为 16,数码使用 0–9 和 A–F 表示。(需要16个字符所以用字母凑数)
-
16进制两位就可以表示一个byte,比01串更方便
-
0x是十六进制的前缀标识。
二进制转十六进制
二进制和十六进制之间的转换就是查查表,每 1 位十六进制数 = 4 位二进制数。
| 十六进制 | 二进制 | 十六进制 | 二进制 |
|---|---|---|---|
| 0 | 0000 | 8 | 1000 |
| 1 | 0001 | 9 | 1001 |
| 2 | 0010 | A | 1010 |
| 3 | 0011 | B | 1011 |
| 4 | 0100 | C | 1100 |
| 5 | 0101 | D | 1101 |
| 6 | 0110 | E | 1110 |
| 7 | 0111 | F | 1111 |
TIP记住ACE,B=A+1,D=A+1,F=A+1
-
对二进制数从右往左每 4 位一组(不足 4 位在左侧补 0)
-
每组转换成对应的十六进制字符
11010111→ 分组:1101 0111→D7→0xD7101→ 补齐为0101→5→0x5100110111001→ 分组:0001 0011 0111 1001→1379→0x1379