进制与数据

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.正负数区间
  • byte
范围:0  - FF
    正数:0  - 7F
    负数:FF - 80
        FF = -1
        FE = -2
        FD = -3
        FC = -4
        FB = -5
  • dword(32)
范围:0  - FFFF FFFF
    正数:0  - 7FFF FFFF
    负数:FFFF FFFF - 8000 0000
5. 位运算
  • and(&,与):同为 1 时才为 1
    1011 0001
    1101 1000
-------------
    1001 0000
  • or(|,或):有一个为 1 就是 1
    1011 0001
    1101 1000
-------------
    1111 1001
  • not(~,非):0 是 1,1 是 0
    1101 1000
-------------
    0010 0111
  • xor(^,异或):不一样的时候是 1
    1011 0001
    1101 1000
-------------
    0110 1001
  • SHL(<<) 左移, 高位丢弃,低位补 0
    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. 计算机通过位运算实现四则运算
  • 4 + 5 = ? 的运算过程
    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
Prev: None Next: 汇编基础