一. 进位计数制

1. 什么是进位计数制

进位计数制是利用固定的数字符号统一的规则来计数的方法。

人类用文字、图表、数字表达和记录着世界上各种各样的信息,便于人们用来处理和交流,人们可以把这些信息都输入到计算机中,由计算机来保存和处理。而我们所使用的计算机都为冯·诺依曼型计算机,所以,计算机内部都使用二进制来表示数据。

这个二进制就是一种计数制,当然还有八进制十进制十六进制。这四个进制是我们现在常用的进制,在古巴比伦还有六十进制的存在,但是这种进制没有0,我们现在把它抛弃了。

那么什么是”进位”呢?,就是我们熟悉的 “逢十进一” 这种,可以向前进一位,这就是进位。

十进制,二进制,八进制,十六进制这些都可以进位,所以他们统一叫做进位计数制

2. 基数

某种进制计数制所允许使用的基本数字符号 (即数码) 它的个数称为这种进制计数制的基数

啥意思?

在十进制中,只有 0,1,2,3,4,5,6,7,8,9 这10个数字吧,这10个符号就是十进制的基本数字符号或者叫做数码,他们就是十进制的基数。

同理,二进制只有0和1,0和1就是二进制的基数,八进制,十六进制同理。

3. 权

同一个数字符号处在不同数位时,其所代表的数值等于它本身乘以一个与它所在数位对应的常数,该常数称为位权,简称

看到这里你可能有点蒙,简单举个例子:

这里有一个十进制的数字 123456 我们想要得到它的位权和

84d7debcde8d9a5c.webp

这是6个数,我们从右开始数,而且从0开始,即 0,1,2,3,4,5位,这就是数位

1的数位是5,2的数位是4,5的数位是1。这里主要是记住从0开始就行了。

那么啥是位权?

这个数字是10进制的,所以它的位权和10有关。

0d14194061998b56.webp

1的数位为5,位权就是10的5次方;5的数位为1,位权就是10的1次方,即

04f3456c461b61e5.webp

这里对于其他的进制有普遍性

81a6f6433ef691da.webp

那如果是小数咋办?举个例子,这次用二进制搞一个,

这里有一个二进制数,100010.101

26be91196bcf3063.webp

可以看见哈,位权的计算方式没啥变化,主要是小数点部分从0往后推,-1,-2,-3这样的。

其他进制同理。

4. 按权展开式

一个数的数值为这个数的每个数位上的数字的位权之和。就是把位权加一起。举个例子:

求十进制数1928.25的数值大小

89cd577bedd89456.webp

等号右面那一串就是十进制数1928.25的按权展开式

cba330bd28f3151d.webp

5. 数制表示

不知道你们是否注意到,我前面提到数字都是这样写的,”十进制数1928.25”,”二进制数100010.101” 我都是告诉你们式多少进制,那如果我们不告诉呢?

求100110的按权展开式

你能求吗?求不了,因为你不知道是多少进制的数,这可能是十进制,也可能是二进制。

这里就有了一个知识,数据的三要素,即:

  • 数制 (即多少进制的)
  • 编码 (后面会讲)
  • 数据形态 (整数,小数还是其他的)

这里的编码后面看就懂了。

我们为了方便表示数制,在数字的后面加上一些东西来表示他是啥数制的,B表示二进制Q表示八进制D表示十进制H表示十六进制

举个例子:

  • 3058.72D 代表十进制数 3058.72
  • 10111.01B 代表二进制数 10111.01
  • 1AB4H 代表十六进制数 1AB4

二. 进制转换

1. 其他进制变十进制

这个就是求按权展开式的结果,比如11011.01B变成十进制,就是它的按位展开式的结果

864f0d831df6151a.webp

八进制,十六进制都一样,按位展开求结果就行

2.十进制变二进制

十进制变二进制,讲究个”除二取余得整数,结果从下往上数;乘二取整得小数,结果从上往下数”

举个例子:

将18.8125D变成二进制

这个数字是一个整数加小数的形式,即18.8125=18+0.8125。

我们先看整数18

95602e9ea29241a1.webp

这里9/2并不是真正等于4,而是它……我相信你们能理解的。

整数部分就是 10010,这里一定要注意,整数的结果是从下往上读

这是整数部分,接下来看小数部分0.8125

9936c00e5aa190cd.webp

即小数部分为 1011,这里一定要注意,小数的结果是从上往下读

把整数和小数整一起,18.8125D就等于10010.1101B

3. 十进制变十六进制

和十进制变二进制有异曲同工之妙。

变二进制用的是 “除二取余,乘二取整”,而变十六进制用的是 “除十六取余,乘十六取整”

比如将 314.31D 变成十六进制数

整数部分为314,小数部分为0.31

8c9ae232e56a86cf.webp

整数部分就是从下往上读,即13A

2ddec9c393b1678e.webp

小数部分就是从上往下读,即 4F

所以 314.31D=13A.4FH (这个H是代表十六进制的,不要弄混了)

4. 二进制变十六进制

二进制变十六进制简单,4位4位变就行了,没位就加0

举个例子:

把 11101.01B变成十六进制

6ebb82d34fa84276.webp

所以整数部分就是1D,小数部分就是4

11101.01B=1D.4

这里可以看出来有两个特点:

  1. 从小数点开始,往两边四位四位取,不够加0

e74ab67781978930.webp

  1. 取4位后,先变十进制,在把十进制变成十六进制。如果你能直接把二进制变成十六进制,就当我没说。

62dde0d734b39d25.webp

  1. 把得到的十六进制,整合起来,小数的话别忘了小数点。

三. 计算机中的编码

上面提到数据的三要素里面有一个编码是吧,这里就会讲一下编码

你们如果干过渗透,爬虫,密码逆向之类的,应该都对编码不陌生,像ANSI,ASCII码,非ASCII编码,Unicode,UTF-8这些的,不过这些大部分人应该都见过,只是不太注意罢了。

比如我们保存文件的时候:

354092128aa1ba2e.webp

这个文件是UTF-8编码,那如果我们把编码变成ANSI看看会发生啥

我们这里是写了一个变格式的脚本

59eecee6aa2ccf21.webp

可以看到,这块变成?,不过这里本来是”你好”,如果说改成其他的编码,甚至会变成乱码。

这就是为哈编码是数据的三要素之一

1. BCD编码

我们知道,计算机基础的信息处理系统是利用电子元件 (硬件) 的不同状态组合来存储和处理信息的。

元件的不同状态组合能代表数字系统的数字,因此,编码就是将符号转换为计算机可以接受的数字系统的数,称为数字代码

BCD (binary-coded decimal) 码也称 “二-十进制编码” ,它是专门解决用二进制数表示十进制数的问题的编码方法。

它既具有二进制数的形式,以满足数字系统的要求,又具有十进制数的特点 (只有10种有效状态)。

在某些情况下,计算机也可以对这种形式的数直接进行运算。

“二-十进制编码” 方法很多,有8421 码、2421码等,最常用的是8421码。

8421码是使用最广的BCD码,是一种有权码,其各位的权分别是 (从最高有效位开始到最低有效位) 8,4,2,1。

这个8,4,2,1应该知道怎么来的吧,2的3次方,2的2次方,上面讲了。

(1) 压缩BCD

我们通过这个位权也能反推出来它是4位数。这个4位数就是所谓的压缩BCD

所以 1D 变成压缩BCD码就是 0001,5D的BCD码就是 0101,10D的压缩BCD码就是 1000。

我们这样能表示1到10的数,那么像15,25,36这样数怎么表示?

很简单,直接俩数放一起。

15是1和5,1的压缩BCD是0001,5的BCD是0101,那么15的压缩BCD就是 0001 0101,就是把他俩放一起就行了

同理,25是2和5,0010和0101放一起,即00100101。36是00110110。

(2) 非压缩BCD

既然有压缩BCD,就有非压缩BCD,压缩BCD是4位数,非压缩BCD是8位数

啥意思呢?1D变成压缩BCD是 0001,变成非压缩BCD就是00000001,整整8位数

15的压缩BCD上面讲了,是00010101,那么它变成非压缩BCD就是 000000001放一起00000101 即 00000000100000101

2. ASCII码

在计算机中,所有的数据在存储和运算时都要使用二进制表示。

例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,这就是编码。

不同的计算机要想互相通信并且不造成混乱,那么每台计算机就必须使用相同的编码规则,于是美国国家标准学会(American National Standard Institute,ANSI)制定了ASCII编码。

(1) ASCII码特性

1. ASCII码是一种西文机内码。

美国信息交换标准代码是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。

它是最通用的信息交换标准,并等同于国际标准 ISO/IEC 646。不知道国际标准就不用管他,没用。

2. 有7位ASCII码和8位ASCII码两种。

标准ASCII码也叫标准ASCII(基础ASCII码)

标准ASCII码用一个字节(8位)表示一个字符,并规定其最高位为0,实际只用到7位,码值为00000000~01111111,即 0~127。因此可表示 128 个不同字符。

标准ASCII码包括数字 0~9,26 个大写英文字母、26 个小写英文字母,以及各种标点符号、运算符号和控制命令符号等。

这玩意主要是看表。

e7feacbe68652e77.webp

(2) ASCII码缺点

ASCII的局限在于只能显示26个基本拉丁字母、阿拉伯数字和英式标点符号,因此只能用于显示现代美国英语(且处理naïve、café、élite等外来语时,必须去除附加符号)。

虽然EASCII解决了部分西欧语言的显示问题,但对更多其他语言依然无能为力。

因此,现在的软件系统大多采用Unicode,特别是与ASCII向下兼容的UTF-8。

3. 无符号数和有符号数

(1) 有符号数

I 有符号数的定义

是用最高位(即从左往右数的第1位),表示符号(0为正数,1为负数),其余位表示数值大小。

有符号数区分正数和负数。

25418c0065c929d9.webp

如图, 第一行的最高位为0,即开头为0,因此它是正数,后面是0010110,即22,所以 有符号数00010110 代表了+22

下面那个的最高位位1,因此他是负数,所以 有符号数10010110 代表-22

II 有符号数的转换

负的

已知二进制数:1 1 1 1 1 1 1 1,把它转化为十进制

先列出表格如下:

11111111
-2^72^62^52^42^32^22^12^0

可以看见,这个二进制数是1开头,所以是负数,所以第一个1是-2^7,后面的和正常一样。

最后全部算出来加一起就行了。等于-1

正的

我们在看看正数,即0开头的

已知二进制数:0 1 0 1 1 0 1 1,把它转化为十进制

先列出表格如下:

01011011
02^602^42^302^12^0

这里就是正常的按权展开,和正常的一样。

这里0能理解吧,0* 2^7 = 0

III 有符号数的表示方法

原码表示法

正数:将其十进制数转化为二进制数;

例如:十进制数11用二进制数表示为0 0 0 0 1 0 1 1

负数:将其十进制数转化为二进制数,最高位为符号位, 取1;

例如:十进制数-11用二进制数表示为1 0 0 0 1 0 1 1

反码表示法

正数:原码 = 反码;

例如:原码为0 0 0 0 1 0 1 1,则其反码为0 0 0 0 1 0 1 1

负数:反码 = 原码除最高位(符号位)外,每位取反;

例如:原码为1 1 1 0 1 0 1,则其反码为1 0 0 1 0 1 0

补码表示法

正数:原码 = 补码;

例如:原码为0 0 0 0 1 0 1 1,则其补码为0 0 0 0 1 0 1 1

负数:补码 = 反码+1;

例如:原码为1 1 1 0 1 0 1,则其反码为1 0 0 1 0 1 0, 其补码为1 0 0 1 0 1 1

移码表示法

正数:移码 = 补码最高位取反;

例如:原码为0 0 0 0 1 0 1 1,则其补码为0 0 0 0 1 0 1 1,则其移码为1 0 0 0 1 0 1 1

负数:移码 = 补码最高位取反;

例如:原码为1 1 1 0 1 0 1,则其反码为1 0 0 1 0 1 0, 其补码为1 0 0 1 0 1 1,其移码为0 0 0 1 0 1 1

(2) 无符号数

无符号数的所有位都用于表示数的大小,只能用于表示非负数

I 无符号数的转换

无符号数的转换和正常的一样,直接按位展开就行了,不用管正负

II 无符号数的表示方法

无符号数没有原码、反码、补码、移码

四. 定点数和浮点数

这俩会一个一个的单独说