数值系统与补数

本文目标

  • 了解计算机如何储存资料
  • 了解计算机如何处理负数以及减法
  • 练习进制间的转换

进制系统

进位制是一种记数方式,利用这种记数方式,人类可以使用有限种数字符号来表示所有的数值。
一种进位制中可以使用的数字符号的数目称为这种进位制的基数或底数,若一个进位制的基数为 n,即可称之为 n 进位制 (即 n 进位)。
现今最常用的进位制是十进位,这种进位制通常使用 10 个阿拉伯数字(即 0-9)进行记数。
-- 修改自维基百科

有了进位制系统,我们可以用不同的基数来表示同一个数值,十进位数字 28 为例:

10 进制 2 进位 8 进位 16 进位
28 11100 34 1C

2 进制

遇到 2 就进位:

10 进制 2 进制
0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111

8 进制

遇到 8 就进位

10 进制 8 进制
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 10
9 11
10 12

16 进制

在 16 进制系统中,可以使用 0 - 15 来表达数值,不过其中的 10 - 15 本身就已经是进位过後的结果了,所以我们会使用英文字母取代 10 - 15 :

10 进制 16 进制
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 A
11 B
12 C
13 D
14 E
15 F
16 10

进制转换

8 进制转 2 进制

在 8 进制系统中,1 个位元可以表示 8 种状态,若以二进制系统我们则需要 3 个位元才能够表示 8 种状态。
要将 8 进制转为 2 进制系统也非常简单,只要将 8 进制系统的单一位元转为 2 进制的 3 个位元即可:

34 (8) -> 011 100 -> 11100 (2) -> 28 (10)

16 进制转 2 进制

在 16 进制系统中,1 个位元可以表示 16 种状态,若以二进制系统我们则需要 4 个位元才能够表示 16 种状态。
要将 16 进制转为 2 进制系统也非常简单,只要将 16 进制系统的单一位元转为 2 进制的 4 个位元即可:

1C (16) -> 0001 1100 -> 11100 (2) -> 28 (10)

n 进制与 10 进制的相互转换

以下范例皆以 n = 2 作为示范。

现在考虑小数点的情况,将二进制数 10011.011B 转换成十进制数字:

了解二进制如何转为十进制之後,再来学习十进制转为二进制的技巧:

  • 整数部份采用以 n 为除数的连除法,直到商小於除数为止,则答案取其所有余数
  • 小数部份采用以 n 为乘数的连乘法,直到积等於零为止,则答案取其所有「进位」。若积数无法至 0,则须取到所指定的位数 (位数越多,转换值越精确)

补数系统

1's 补数

将二进位数按位元逐个反转,就可以得到的其 1's 补数(ones' complement)。

举例

0001 (+1) 的一补数为 1110 (-1)
按照上面的范例,我们一次列举出更多的数字出来:

2 进制 无号数 有号数 一补数
0000 0 0 0
0001 1 1 1
0010 2 2 2
0011 3 3 3
0100 4 4 4
0101 5 5 5
0110 6 6 6
0111 7 7 7
1000 8 -0 -7
1001 9 -1 -6
1010 10 -2 -5
1011 11 -3 -4
1100 12 -4 -3
1101 13 -5 -2
1110 14 -6 -1
1111 15 -7 -0

1's 补数加法

一补数的特性可使加法电路同时可以运算减法,像是:

0001 (1) + 1100 (-3) = 1101 (-2)

2's 补数

不管事一补数或是有号数的储存方式都会产生 -0 这个结果,为了避免这个问题,电脑科学家又进一步发展出二补数,二补数的计算方式非常简单:

  • MSB 最高位元为负数
  • 其余皆为正数
  • 任何数字的二补数都等於其一的补数 + 1

举例

-7 为例,我们先将其转为一补数:

1000

接着将一补数 +1 得到二补数:

1001

至於刚刚提到的 MSB 最高位元为负数,其余皆为正数 这两条规则,我们可以用来进行验算:

-8 (MSB) 4 2 1 (LSB)
1 0 0 1

(-8)x1 + 4x0 + 2x0 + 1x1 = -7

总结

在学习编写系统程序时,进制间转换与补数系统是必备的基本技能之一,现今的电脑多采用二进制系统 + 二补数系统来储存资料,所以在学习进阶技巧之前才会特别规划一篇文章供读者复习,希望能够帮助到大家。

Reference


<<:  Day1 Why Go?

>>:  Day1 Let's ODOO: 前言

伪类与伪元素-30天学会HTML+CSS,制作精美网站

昨天介绍了各种选择器,今天介绍伪类及伪元素样式设定,可以让画面有更多的样式变化,也减少html co...

Day27-介绍 React Developer Tools

在 Day 25 介绍 React Profiler 的文章中有提到 React Developer...

Day 18 Chatbot integration- Face Login- 人脸登入

Chatbot integration- Face Login- 人脸登入 这边要做的事情不是用人脸...

Day32 ( 电子元件 ) 全彩 LED 光线变化 ( 共阳极 )

全彩 LED 光线变化 ( 共阳极 ) 教学原文参考:全彩 LED 光线变化 ( 共阳极 ) 全彩 ...

Day-13 线性时间演算法 : Counting sort

Counting sort Input : Output : Aux(auxiliary) arra...