进制与数据
Tutorial: C与汇编
Category: C语言
Published: 2026-04-07 13:58:26
Views: 21
Likes: 0
Comments: 0
1. 16 与 2 进制转换
0 1 2 3 4 5 6 7
0000 0001 0010 0011 0100 0101 0110 0111
8 9 A(10) B(11) C(12) D(13) E(14) F(15)
1000 1001 1010 1011 1100 1101 1110 1111
举例:
2^0=1, 2^1=2, 2^2=4, 2^3=8
8 = 8 + 0 + 0 + 0 = 1*2^3 + 0*2^2 + 0*2^1 + 0^2^0
A = 8 + 2 = 1010
5 = 4 + 1 = 0101
E = 8 + 4 + 2 = 1110
2. 数据宽度
位: bit, 0/1
字节: byte, 8bit = FF(最大)
字: word, 16bit = FFFF(最大)
双字: dword, 32bit = FFFF FFFF(最大)
3. 有符号数的编码规则
原码:最高位位符号位,其余各位为数值本身的绝对值
反码:
正数:反码与原码相同
负数:符号位为1,其余位对源码取反
补码:
正数:与原码相同
负数: 符号位为1,其余位对原码取反+1
1 => 0000 0001(原码,反码,补码都一样)
6 => 0000 0110(原码,反码,补码都一样)
-1
原码:1000 0001
反码:1111 1110
补码:1111 1111 => 内存中存放 FF
-7
原码:1000 0111
反码:1111 1000
补码:1111 1001 => 内存中存放 F9
4.正负数区间
范围:0 - FF
正数:0 - 7F
负数:FF - 80
FF = -1
FE = -2
FD = -3
FC = -4
FB = -5
范围:0 - FFFF FFFF
正数:0 - 7FFF FFFF
负数:FFFF FFFF - 8000 0000
5. 位运算
1011 0001
1101 1000
-------------
1001 0000
1011 0001
1101 1000
-------------
1111 1001
1101 1000
-------------
0010 0111
1011 0001
1101 1000
-------------
0110 1001
1101 1000 左移2 => 0110 0000
- SHR/SAR(>>) 右移, 低位丢弃,高位补 0 或者符号位
无符号型:unsigned int a = 10
1101 0101 => 0011 0101
有符号型:int a = 10, 只能补1
1101 0101 => 1111 0101
6. 计算机通过位运算实现四则运算
0000 0100
0000 0101
---------
过程:
1. 先异或
0000 0100
xor 0000 0101
---------
0000 0001 = x1
2. 与运算,判断是否有进位
0000 0100
& 0000 0101
---------
0000 0100 => & 之后,结果不是0,表示有进位,
右起第3个是1,表示要进位,即 0000 1000,或者理解为 左移一位 = x2
3. 1 的结果,与 2 的结果(0000 1000)继续异或
0000 0001
xor 0000 1000
---------
0000 1001 = x3
4. 1 的结果和 2 的结果(0000 1000)与运算,判断是否有进位
0000 0001
& 0000 1000
---------
0000 0000 => & 之后,结果是0,表示无进位
5. 结果就是 0000 1001 => 9
总结:
a + b
1. a xor b = x1
2. a & b = x2
x2 != 0:
a = x1, b = x2
3. a xor b = x3
4. a & b = x4 = 0
5. res = x3
- 4 - 5 = ? 的运算过程 (4 + (-5))
0000 0100
1111 1011
---------
过程:
1. 先异或
0000 0100
xor 1111 1011
---------
1111 1111 = x1
2. 与运算,判断是否有进位
0000 0100
& 1111 1011
---------
0000 0000 => & 之后,结果是0, 表示没有进位
3. res = 1111 1111 = FF = -1