zoukankan      html  css  js  c++  java
  • 《程序是怎样跑起来的》读书笔记——第二章 数据是用二进制数表示的

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

    • 计算机内部是由IC这种电子部件构成的。
    • IC有几种不同的形状,有的像一条黑色蜈蚣,在其两侧有数个乃至数百个引脚。
    • IC 的所有引脚,只有直流电压 0V 或 5VB 两个状态。也就是说,IC 的一个引脚,只能表示两个状态。

      二进制数的位数一般是 8 位、16 位、32 位……也就是 8 的倍数, 这是因为计算机所处理的信息的基本单位是 8 位二进制数。8位二进制数被称为一个 字节。字节是最基本的信息计量单位。位是最小单位,字节是基本单位

    • 规则一:高位补0 用字节单位处理数据时,如果数字小于存储数据的字节数(二进制数的位数),那么高位上就用 0 填补。

      例如,100111 这个 6 位二进制 数,用 8 位(=1 字节)表示时为 00100111,用 16 位(= 2 字节)表示 时为 0000000000100111。

    即使是用十进制数和文字等记述信息,在编译后也会转 换成二进制数的值,所以,程序运行时计算机内部处理的也是用二进 制数表示的信息

    2 什么是二进制数

    为了更清晰地说明二进制数的机制,首先让我 们把 00100111 这个二进制数值转换成十进制数值来看一下。

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

    移位运算指的是将二进制数值的各数 位进行左右移位(shift = 移位)的运算。移位有左移(向高位方向) 和右移(向低位方向)两种。在一次运算中,可以进行多个数位的移 位操作。

    将变量 a 的值左移两位的 C 语言程序

    a = 39;
    b = a << 2;
    

    由于移位运算是针对二进制数值的位操作,十进制数 39 的移位操作就行不通了. 无论程序中使用的是几进制,计算机内部都会将其转换成二进制数来处理, 因此都能进行移位操作。

    十进制数 39 用 8 位的二进制 表示是 00100111,左移两位后是 10011100,再转换成十进制数就是 156。 不过这里没有考虑数值的符号。

    Tip:十进制数左移后会变 成原来的 10 倍、100 倍、1000 倍……同样,二进制数左移后就会变成 原来的 2 倍、4 倍、8 倍……反之,二进制数右移后则会变成原来的 1/2、1/4、1/8……

    4 便于计算机处理的“补数”

    4.1 二进制数表示负数

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

    那么-1 用 8 位二进制数来表示的话是什么样的呢?可 能很多人会认为“1 的二进制数是 00000001,因此-1 就是 10000001”,但这个答案是错的❌,正确答案是 11111111。

    计算机在做减法运算时,实际上内部是在做加法运算。用加法 运算来实现减法运算。在表示负数时就需 要使用“二进制的补数”。 补数就是用正数来表示负数

    获得补数,我们需要将二进制数的各数位的数值全部取反 , 然后再将结果加 1。例如,用 8 位二进制数表示-1 时,只需求得 1, 也就是 00000001 的补数即可。补数求解的变换方法就是“取反+1”。

    4.2 计算机如何计算1+(-1)

    这一运算,我们都知道答案应该是 0。首先,让我们将-1 表示成 10000001(错误的表示方法)来运算,看看结 果 如 何。00000001+10000001 = 10000010, 很 明 显 结 果 不 是 0。

    接下来,让我们把-1 表示成 11111111(正确的表示方法)来进行 运算。 00000001+11111111 确实为 0(= 00000000)。这个运算中出现 了最高位溢出的情况,对于溢出的位, 计算机会直接忽略掉。

    当然,结果不为 0 的运算同样可以通过使用补数来得到正确的结 果。不过,有一点需要注意,当运算结果为负数时,计算结果的值也 是以补数的形式来表示的。

    比如 3-5 这个运算,用 8 位二进制数表示 3 时 为 00000011, 而 5 = 00000101 的 补 数 为“取 反+1”, 也 就 是 11111011。因此 3-5 其实就是 00000011+11111011 的运算。

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

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

    将二进制数作为带符号的数值进行运算时,移位后要在最高位填 充移位前符号位的值(0 或 1)。这就称为算术右移

    一个右移的例子。将-4(= 11111100)右移两位。这 时,逻辑右移的情况下结果就会变成 00111111,也就是十进制数 63, 显然不是-4 的 1/4。而算术右移的情况下,结果就会变成 11111111, 用补数表示就是-1,即-4 的 ¼(图 2-10)。

    符号扩充

    符号扩充就 是指在保持值不变的前提下将其转换成 16 位和 32 位的二进制数。不管是正数还是用补 数表示的负数,都只需用符号位的值(0 或者 1)填充高位即可。

    6 掌握逻辑运算的窍门

    计算机能处理的运算,大体可分为算术运算逻辑运算算术运算是指加减乘除四则运算。 逻辑运算是指对二进制数各数字位的 0 和 1 分别进行处理的运算,包括逻辑非(NOT 运算)、逻辑与(AND 运 算)、逻辑或(OR 运算)和逻辑异或(XOR 运算 A)四种。

    • 逻辑非指的是0变成1、1变成0的取反操作。
    • 逻辑与 指的是“两个都是1”时,运算结果为1,其他情况下运算结果都为0 的运算。
    • 逻辑或 指的是“至少有一方是1”时,运算结果为1,其他情况下运算结果都 是0的运算 。
    • 逻辑异或 指的是排斥相同数值的运算。“两个数值不同”,也就是说,当“其中一方是1,另一方是0”时运算结果是1,其他情况下结果都是****0。
  • 相关阅读:
    .net验证是否合法邮箱和ip地址的方式
    .net通用类型转换方法
    asp.net中的<%%>的使用
    autofac初识
    .net面试题
    asp.net使用一般处理程序实现文件下载
    asp.net 一般处理程序接收上传文件的问题
    Python学习日记(十八) 序列化模块
    Python学习日记(十七) os模块和sys模块
    Python学习日记(十六) time模块和random模块
  • 原文地址:https://www.cnblogs.com/cmi-sh-love/p/cheng-xu-shi-zen-yang-pao-qi-lai-de-du-shu-bi-jidi.html
Copyright © 2011-2022 走看看