# 计算机基础知识

# 二进制

计算机为什么要用二进制呢?

首先需要讲到二进制的优点:

只有两种状态,容易找到这种物质。易实现简单的逻辑。

缺点:

占用的存储空间多

# 原码/反码/补码

属于计算机基础知识, 必掌握.

计算机通常是按字节为单位来存储数据的,一个字节是8bit,也就是说最大代表256种数据。

正数的原码、反码、补码都是它本身

原码

2的原码表示:0000 0010

-2的原码表示:1000 0010

反码

正数按位取反,或者负数除符号位之外按位取反

正数的反码==原码,2的反码表示:0000 0010

负数的反码:除符号位之外,全部取反,-2的反码表示:1111 1101

补码

反码+1=补码, 负数就是用补码表示。也可以这样算:负数的补码就是正数按位取反后+1,不需要排除符号位。

总结,两种方式求负数补码:

  1. 其对应正数按位取反后+1
  2. 负数的原码,除符号位之外都取反,然后+1

正数的补码=原码,2的补码表示:0000 0010

负数的补码:反码+1,-2的补码表示:1111 1110

经过计算可以得到结论:**数字a(无论正负)的补码就是-a。**但存在特例(0、-128),0其实不严格算特列,0的补码仍然是0,是合理的,但-128的补码依然是-128,不合理,所以需要了解这两种特例场景,在其他bit同样存在。

# 计算机为什么要用补码来存储数据呢?

主要原因是补码系统只需要一种加法电路就能同时实现加法和减法运算。同时补码系统中的0只有一个表示方式,因此在判断是否为0时只需要比较一次即可。

我们通过十进制的1+(-1)=2来举例,分别将-1用三种码与1相加,看看结果是什么。

正数的三码合一,所以1都是用0000 0001表示(在8bit补码系统中)

负数用原码表示:0000 0001 + 1000 0001 = 1000 0010 (-2),结果为-2,无法正确计算。

负数用反码表示:0000 0001 + 1111 1110 = 1111 1111 (-0),将反码转为原码得到结果为-0,这样会导致0这一个数存在两个码都可以表示,不合理。

负数用补码表示:0000 0001 + 1111 1111 = 0000 0000 (0),结果为0,正确计算。

# 计算溢出后如何处理?

通常数值都是有固定的存储大小的,像Java中的整型就是4字节(32位)大小,当计算发生溢出时,通常是选择丢弃溢出的进位。

你可以将其抽象为一个时钟,是一个环状。以8bit为例,时钟上0为起点(12点钟方向),走半圆后到达127(6点钟方向),此时再+1便会溢出为-128,-128不断+1会走完剩下的半圆回到0的起点。

此处还可以引出一个数论概念,同余定理:两个整数a、b,满足(a-b)mod一个数m,得到一个整数,则称a、b对m同余。

二级制发生溢出时,可以利用同余来求结果。

在8bit有符号数中,例如:127 + 5 = -124,同样有 127 + (-251) = -124。可以发现|5| + |-251| = 256或者5 - (-251) = 256,所以当发生溢出时,可以改为加上它同余的数,更方便计算。

以上同样可以抽象到时钟上,假设当前时间为6点钟,如果我需要指到4点钟方向,则需要-2或者+10,而10、-2正好对12同余。

# 数据的单位

存在几个容易混淆的概念,通常业内数据的单位都是1024进位的,但某些领域上会存在以100进位的单位,例如硬盘容量。

因此会有几个单位看起来很像,但实际是不一样的,为了表达不同进位的单位:Kb、Kib、KB、KiB。

**多一个i是表示什么?**代表1024进位的写法。例如KB代表国际单位制标准规定的1000进位,KiB是1024进位的标准写法。

**为什么会有大写B小写b?**大写B表示Byte,小写b表示bit,bit常见于描述带宽和媒体码率(由于网络传输实际上是传输一个个二进制数,是按位算的,也被称为比特流,所以常用bit表示)。

**电脑上文件大小是如何表示的?**随便在windows上找一张图片,可以看到其属性中关于占用大小的数据有两个(大小、占用空间)。大小表示其文件真实的大小,有多少个字节。占用空间表示在计算机中占用了多少空间,因为并不是你文件多大,就会占用多大空间,这是跟磁盘上最小存储单位有关的,例如在NTFS分区上,文件存储最小区块是簇,一般情况下默认簇大小为4k,就算你文件大小只有1b,也会有4k的空间占用。因此,你用文件大小去除1024,往往是除不尽的,而用占用空间去除1024一定是可以的。

windows使用了1024进位,但是没有按照标准写,因为当时这个规定加入ISO时windows已经出到win98了;Linux和MacOS使用1000进位,并且按照规范表示了。

# 网络的单位转换

1M 宽带 = 1024Kbps(ADSL上网的最高速率),Kbps中的b是bit的意思。

1024Kbps = 128KBps,因为8bit = 1byte,KBps中的B是Byte(字节)的意思,要注意区分b的大小写意思。

kbps = kbits/s,KBps = KBytes/s

kbps:比特率,数字信号传输速率,即每秒钟传输多少个千位的信息。

KBps:每秒钟传输多少个千字节。

修改于: 8/11/2022, 3:17:56 PM