如何负数转正数_如何设计一个 CPU - (1) 数据表达

cdfb54f6267bb4443c496305c51ba000.png

首先,计算机使用二进制来表示数据。

二进制的表示

在计算机中,二进制的最基本单位是 比特 (bit, binary digit 的简称)。一个比特有 2 种状态,分别是“1”和“0”。但在不同情况下,他们也会被称为:

1:真、true、开、高电平、置位、set ...

0:假、false、关、低电平、重置、reset ...

为了让本来就很复杂的知识不要变得更加复杂,文章后面会使用 1 和 0 来代替上面的所有称呼方法。

二进制转换

现在,我们拥有了两种不同的进制体系:日常中的十进制 和 计算机的二进制。为了区分两种进制,我们在前面添加 "0b" 来表示一个二进制数。

二进制和十进制互相转换的方法,相信大家在学校的信息技术课中都学到过,也可以参考这篇文章来复习一下。

但本着工科生能偷懒就偷懒的态度,我们可以借助 Python 进行快速的进制转换:

>>> bin(24)             # 十进制转二进制
"0b11000"

>>> int("0b11000", 2)   # 二进制转十进制
24

另外,十六进制也是经常被使用的一个进制体系,因为它可以大大缩减二进制数的长度,比如

0b1010101111001101

这个数,乍一看肯定不知道它是多少,但换成十六进制,

0xABCD

就显得比较清晰明了。

和二进制相似,我们在十六进制数的前面添加 "0x" 来标示。

>>> hex(43981)             # 十进制转二进制
"0xABCD"

>>> int("0xABCD", 16)   # 二进制转十进制
43981

计算机单位

如同物理单位一样,1 千米 = 1000 米,1 米 = 1000 毫米,计算机中也有类似的 单位 概念。

比特 (bit) 作为最基本的单位,我们有:

1 字节 (byte) = 8 bit
1 半词 (half word) = 2 byte = 16 bit
1 词 (word) = 4 byte = 32 bit
1 双词 (double word) = 8 byte = 64 bit

并且,

1 千字节 (kilobyte, kB) = 1000 byte = 8000 bit

1 千字节 (kibibyte, KiB) = 1024 byte = 8192 bit

1 兆字节 (megabyte, MB) = 1000 KB

1 兆字节 (mebibyte, MiB) = 1024 KiB

1 吉字节 (gigabyte, GB) = 1000 MB

1 吉字节 (gibibyte, GiB) = 1024 MiB

1 太字节 (terabyte, TB) = 1000 GB

1 太字节 (tebibyte, TiB) = 1024 GiB

... (以此类推)

注意,英文有两种单位体系,分别对应着 适合计算机的 1024 进位 国际单位制基本单位系统所规定的 1000 进位[1]。中文翻译并没有对两者进行区分,所以还是以单位缩写为准。本文因为大量涉及到计算机的软硬件,所以会使用 1024 进制的单位系统。

数字的表示

1 个字节最大能表示 255 的数字,1 个词最大能表示 4294967295,而 1 个双词则是 18446744073709551615。这些已经足够用来表示我们常见的所有数字了,但是如何表示负数呢?

和十进制相似,二进制也使用 符号 (sign) 来区别正数和负数。十进制的符号是 + 和 -,而二进制则是 0 和 1。注意和常理不同,0 对应的是 + 号,1 对应 -。

但如果是简单地把一个数的最高位解释成符号的话,我们会面临一个尴尬的问题:在这个数字系统中会出现两个 0,分别是 0b0000 0000 和 0b1000 0000,也就是 +0 和 -0。

这样子会很麻烦,会引起诸如 1+ (-0) = +0 之类的数学错误,我们需要略微调整一下这套数字体系。

伟大的冯 · 诺曼因此提出了二补数 (2's complement) 系统[2]。在这套系统中,将一个正数转换成负数的操作是将该数字 按位取反再加 1

比如:将 6 转换为 -6

6 = 0b0000 0110

按位取反,

= 0b1111 1001

再加 1,-6 = 0b1111 1010

这样我们就有了两套表示整数的方法,无符号整数 (unsigned int) 和 有符号整数 (signed int)。为了区别,我们会在无符号整数的后面加上 "U" 来标注,比如

0x1234U

这两套系统各有优点,同样大小下无符号整数能表示更大的数,但只有有符号整数才能表示负数,所以计算机中同时使用这两套系统,并会以关键词 unsigned 和 signed 来作区分。

之后是二进制的小数。二进制的小数系统使用浮点数来表示。浮点数比较复杂,而本系列之后的内容也不太会涉及到,因此这里也就不多做解释,感兴趣的读者可以通过这些资料进行了解。

于是乎,我们也发现了计算机数据表示中另一个特点,也就是计算机中的 所有信息都通过数字来表示,但一段数字具体表示什么样的信息则需要通过 数据类型 来进行规定。

[3]

参考

  1. ^https://en.wikipedia.org/wiki/Orders_of_magnitude_(data)
  2. ^https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html
  3. ^封面图片 https://knowthecode.io/labs/basics-of-digitizing-data/episode-6
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值