《程序是怎样跑起来的》|第2章 数据是用二进制数表示的

215 阅读5分钟

热身问答

  1. 32 位是几个字节?
  2. 二进制数01011100转换成十进制数是多少?
  3. 二进制数00001111左移两位后,会变成原来的几倍?
  4. 补码形式表示的 8 位二进制数 11111111,用十进制表示的话是多少?
  5. 补码形式标识的 8 位二进制数 10101010,用 16 位的二进制数表示的话是多少?
  6. 反转部分图形模式时,使用的是什么逻辑运算?

答案:

  1. 4 字节
  2. 92
  3. 4 倍
  4. -1
  5. 1111111110101010
  6. XOR 运算

解析:

  1. 因为 8 位=1 字节,所以 32 位就是 4 字节
  2. 将二进制的各数位的值和位权想乘后再相加,即可转换成十进制数。
  3. 二进制数左移 1 位后会变成原来的值的 2 倍。左移两位后,就是 2 倍的 2 倍,即4 倍
  4. 所有位都是 1 的二进制数,用十进制数表示的话就是-1
  5. 使用原数的最高位 1 来填充高位
  6. XOR 运算只反转与 1 对应的位。NOT 运算是发转所有的位。

本章重点

要想对程序的运行机制形成一个大致印象,就要了解信息(数据)在计算机内部是以怎样的形式来表现的,又是以怎样的方式来运算的。

在 C 和 Java 等高级语音编写的程序中,数值、字符串和图像等信息在计算机内部都是以二进制的形式来表现的。也就是说,只要掌握了二进制数来表示信息的方法及运算机制,也就自然能够了解程序的运行机制了。

那么,为什么计算机处理的信息要用二进制来表示呢?

2.1 用二进制数表示计算机信息的原因

计算机内部是用 IC构成的,IC 的所有引脚,只有 0V 和 5V 两个状态,只能表示两个状态。

IC 的这个特效,决定了计算机的信息数据只能用二进制数来处理。

image.png 对于二进制数表示的信息,计算机不会区分他是数值、文字,还是某种图片的模式等,而是根据编写程序的各位对计算机发出的指示来进行信息的处理(运算)

2.2 什么是二进制数

image.png

2.3 移位运算和乘除运算的关系

image.png

2.4 便于计算机处理的“补救”

二进制数中表示负数值时,一般会把最高位作为符号来使用,因此我们把这个最高位称为符号位。符号位是0时表示正数,符号位是1时表示负数

为了获得补数,我们需要将二进制数的各数位的数值全部取反[插图],然后再将结果加1。例如,用8位二进制数表示- 1时,只需求得1,也就是00000001的补数即可。具体来说,就是将各数位的0取反成1, 1取反成0,然后再将取反的结果加1,最后就转化成了11111111

image.png

将二进制数的值取反后加1的结果,和原来的值相加,结果为0

2.5 逻辑右移和算术右移的区别

当二进制数的值表示图形模式而非数值时,移位后需要在最高位补0。类似于霓虹灯往右滚动的效果。这就称为逻辑右移

image.png

逻辑右移和算术右移是在计算机中用于处理二进制数值的操作。它们之间的区别在于处理有符号数(带符号位的数)时的方式。

  1. 逻辑右移(Logical Right Shift): 在逻辑右移中,所有位向右移动指定的位数,最左边的位补上0。这种操作通常用于无符号数,因为无符号数的最高位不表示符号,只表示数值大小。逻辑右移用于逻辑运算和位操作等场景。

    例如,将二进制数 11011010 逻辑右移2位得到 00110110

  2. 算术右移(Arithmetic Right Shift): 在算术右移中,所有位向右移动指定的位数,最左边的位用原来的符号位填充。这种操作用于处理有符号数,以保持数值的符号。

    例如,将二进制数 11011010(-42的二进制表示)算术右移2位得到 11110110,因为最左边的符号位是1(表示负数)。

总结:逻辑右移在移位过程中补0,用于处理无符号数;算术右移在移位过程中用符号位填充,用于处理有符号数,以保持数值的符号。

2.6 掌握逻辑运算的窍门

在运算中,与逻辑相对的术语是算术。我们不妨这样考虑,将二进制数表示的信息作为四则运算的数值来处理就是算术。而像图形模式那样,将数值处理为单纯的0和1的罗列就是逻辑。

COlUMN如果是你,你会怎样介绍?向小学生讲解 CPU 和二进制