0. 可屏蔽中断即cpu可以不予处理的中断;(非)不可屏蔽中断即cpu必须要去处理的中断。

1. 二进制 -> 十进制 :幂级指数法

 10111 101 B = 1*2^4 + 0*2^3 + 1*2^2 + 1*2^1 + 1*2^0 . 1*2^-1 + 0*2^-2 + 1*2^-3 = 16 + 4 + 2 + 1 .  1/2 + 1/8 = 23.625 D

2. 十进制 -> 二进制 :整数部分除2取余,小数部分乘2取整

 23 / 2 = 11,11 / 2 = 5,5 / 2 = 2,2 / 2 = 1,1 / 2 = 0   出现0就停止,整数部分将余数从右往左取,即 10111

 23%2 = 1, 11%2 = 1,5%2 = 1,2%2 = 0,1%2 =  

 0.625 * 2 = 1.25,(1.25 - 1) * 2 = 0.5,0.5 * 2 = 1,(1 - 1) * 2 = 0,0 * 2 = 0   出现1就停止,小数部分将取整从左往右取,即 10100

 1.25 >=1 取整 1, 0.5 不>=1 取整  0,1 >=1 取整  1,0 不>=1 取整  0,0 不>=1 取整  0故23.625D = 10111.101B = 0010111.10100B, 长度取决于有效位个数

 case 0.77 * 2 = 1.54,(1.54 - 1) * 2 = 1.08,(1.08 - 1) * 2 = 0.16,0.16 * 2 = 0.32,0.32 * 2 = 0.64,0.64 * 2 = 1.28,(1.28 - 1) * 2 = 0.56 .... 

 故 1.77D = 1.110001B = 1.110B 长度取决于有效位个数

3. 8 / 16进制 -> 二进制

 每一个8 / 16进制数转为对应的 3 / 4个二进制数的序列

4. 二进制 -> 8 / 16进制

 整数部分:从小数点向左数,每 3 / 4位为一组,高位补0; 小数部分:从小数点向右数,每 3 / 4位为一组,低位补0;

 故 23.625 D = 10111.101 B = 17.A H = 27.5 O

 b/B 2进制数尾缀;o/O 8进制数尾缀;d/D 10进制数尾缀;h/H 16进制数尾缀;f/F 浮点数尾缀;

 阿拉伯数字串以0开头的表示8进制数,以0x开头的表示16进制数,以非0数开头的表示10进制数     

   023 = 2 * 8^1 + 3 * 8^0 = 19D != 0x19D;0x23 = 2 * 16^1 + 3 * 16^0 = 35D;23 = 23D

5. BCD码 本质上是10进制数而非二进制数,每4位为一组,不向上累计

   10111 . 101 B = 23.625 D = 0010 0011.0110 0010 0101 BCD

6. 有符号数的表示

  原码 :最高位表正负,其余位表数值

    +1 :0000 0001          +0 :0000 0000

    -1 :1000 0001           -0 :1000 0000

   反码 :正数的反码等于原码,负数则符号位不变,其余位按位取反

     +1 :0000 0001          +0 :0000 0000

     -1 :1111 1110            -0 :1111 1111

   补码 :正数的补码等于原码,负数的补码等于其反码+1,注意符号位也需要向上进位,补码的优点是将减法运算变为加法运算

      +1 :0000 0001          +0 :0000 0000

      -1 :1111 1111          -0 :1 0000 0000 (只取低8位)

   例 66 - 51 = 66 + (-51) = 66补码 + (-51)补码 = 0100 0010 + 1100 1101 = 1 0000 1111  只取低8位即 =15D;同时因为0000 1111 的最高位为0,因此66-51的值是一个正数。

  而 -66 + 51 = -66补码 + 51补码 = 1011 1110 + 0011 0011 = 1111 0001,因此-66 + 51的值是一个负数,而计算机中所有的整数都是采用补码的形式存储,即1111 0001必然是某个负数的补码表示,因此根据负数补码的生成规则反推负数的原码即可。 1111 0001 - 1 = 1111 0000, ~(111 0000) = 000 1111,因此原码是1000 1111,即 1111 0001 = -15 D

  对于8位宽的cpu, -1补码 = 0xFF, -2补码 = 0xFE, -3补码 = 0xFD ...      因此 0xFF + 1 = -1 + 1 = 0xFE + 2 = -2 + 2 = 1 0000 0000,当只取低8位时即 = 0;由此得出一个推论:负数值的绝对值与其补码值的和为0x100 或 0x10000 或 0x10000 0000(取决于cpu的数据位宽), 因此负数值的绝对值 = 0x100 或 0x10000 或 0x10000 0000 - 负数的补码值, 即 0x100 - 1111 0001B = 0x100 - 0xF1 = 0x0F,因此原数等于 -15。

7. 1000 0000B = 0x80H  可表示以下含义 :

  1. 对无符号数而言 0x80H = 128 D

  2. 对原码而言 0x80H = -0

  3. 对反码而言 0x80H = -127

  4. 对补码而言 0x80H = -128

8. 无符号数可表示的范围:

  [0,2^n - 1]  (n 为cpu的数据位宽)

 无符号数 加 / 减 溢出的判断方法:

  当最高位向更高位有 进 / 借 位时,则产生 加 / 减 溢出

 有符号数的可表示范围:

  原码与反码为   [ -(2^(n-1) -1),+(2^(n-1) -1) ] ,对于8位cpu 为 [ -127, +127 ]

  补码为   [ -(2^(n-1)),+(2^(n-1) -1) ] , 对于8位cpu 为 [ -128, +127 ]

 有符号数 加 / 减 溢出的判定方法:

  最高位进位状态与次高位进位状态的异或值为1(即2者进位状态不同)时,产生溢出;异或值为0(即2者进位状态相同(都有进位 / 都没有进位))时,不产生溢出;

 有符号二进制数与十进制数的转换:

  原码 = 符号位 + 绝对值

  正数的补码 = 原码 = 符号位 + 绝对值

  负数的补码 != 原码,故负数的补码 != 符号位 + 绝对值

  原/反/补 码中,若最高位为 0 / 1 则其真值必为 正 / 负 数。

  例,若 x补 = 0010 1110B,则 x = + 010 1110B = +0x2eH = +46D; 若 x补 = 1101 0010B,则 x != - 101 0010B,x = 0x100 - 1101 0010B = 0010 1110 = -46D

9. 浮点数的表示

  bit31:表正负

  bit30-23 :这8位用于存储指数数值与+127的相加和,注意底数是2而非10

  bit22-0 : 这23位用于存储有效位(有效位的形式必须是小数点前有且仅有一个1)小数点后的内容

  例 625.9 = 0.625 * 10^3 = 1001110001.111001100110011001100B = 1.001110001111001100110011001100 * 2^9B = 0.1001110001111001100110011001100 * 2^10B,且为正数;

  因此符号位是0,指数数值是9,相加和是136,有效位取前23位是00111000111100110011001,因此 625.9D 的二进制表示是

  0:10001000:00111000111100110011001 = 0100 0100 0001 1100 0111 1001 1001 1001B = 0x441c7999H,同时计算机会在浮点数的结尾自动+1,因此625.9D的二进制形式为0x441c799AH

 

posted on 2024-02-22 14:29  lance9527  阅读(38)  评论(0编辑  收藏  举报