跳转至

📔 Lecture02 Number Representation

更新日期:2023.11.02

1. 概述

通常数据始于模拟域,然后将其转换为数字域。

为了将模拟数据转换为数字数据,必须要做两件事情:

  • 数据采样
    • 对于每个时间步骤上都进行标注访问(一般是一个固定的间隔)。
  • 数据量化
    • 对于每秒钟访问多少次,这就是高度,对于幅度来说,通常是对其进行量化,然后通过某种标准衡量其振幅。

这也是将模拟数据输入到计算机系统中的方式。但与此同时,并不是所有的数据都是模拟数据。例如创作出来的艺术、音乐、视频、图片等。

该部分中比较重要的思想:位(Bits)可以表示任何东西。例如:

  • 字符

    • 26个字母
    • 大小写字母和标点符号(7 bits (in 8) ("ASCII"))
    • 涵盖世界上所有语言的标准代码(8,16,32 bits(“Unicode”))
      • 对于表情包来说,也是属于Unicode的部分
  • 逻辑值

    • 0(False)
    • 1(True)
  • 颜色

  • 位置/地址
  • 命令

记住:N bits ⇔ at most 2^N th

2. 二进制、十进制和十六进制和进制转换

如果不写任何基数的情况下,默认的基数就是10。

在日常生活中使用十进制表示数制,但在计算机中使用二进制位来表示所有信息。

2.1 十进制

2.2 二进制

2.3 十六进制

2.4 十进制与二进制互转

2.5 十进制与十六进制互转

2.6 使用进制的问题

  • 十进制
    • 人类能理解的表示方式,特别是人类算术计算。
  • 十六进制

    • 如果需要查看长串二进制数字,就直接转换为十六进制,会比直接查看4位/符号要容易。
  • 二进制

    • 可以在计算机中,对所有数字进行乘法、除法等任何运算。
    • 在计算机系统中,常见的晶体管只有两种状态(开和关),就是使用二进制。

对于进制的使用,一般会在数字的下标标注基数,或者使用前缀或者后缀的方式表明,从而避免代码或者读写的歧义问题。

2.7 代码实例

#include <stdio.h>

int main()
{
    const int N = 1234;
    printf("Decimal:    = %d\n", N);
    printf("Hex:        = %x\n", N);
    printf("Octal:      = %o\n", N);

    printf("Literals (not supported by all compilers) : \n");
    printf("0x4d2           = %d (hex)\n", 0x4d2);
    printf("0b10011010010   = %d (binary)\n", 0b10011010010);
    printf("02322           = %d (octal, prefix 0 - zero)\n", 02322);

    return 0;
}

3. 正负数表示

对于数字来说,可以用来进行运算:

  • 加法
  • 减法
  • 乘法
  • 除法
  • 比较

例如十进制数相加的例子:10 + 7 = 17。那么二进制的简单加法可以使用电路实现。

思考题:如何使用二进制表示的方式测试一个数字是否大于另一个数字?

二进制位就是简单的数字抽象的表示。

溢出:如果进行一个运算时,结果无法必须存储到已分配的位数中时,称为 溢出(overflow)

3.1 负数的表示

3.2 补码表示

4. 说明

  • 本部分的知识点紧凑,所以可以参考《南京大学 袁春风 计算机系统基础》