计算机系统概论——第2章 bit、数据类型及其运算

2.1 bit和数据类型

①bit是信息存储的基本单位,也是二进制中的一位,只能取“0”或“1”。n个bit可以表示$2^n$个不同的状态。

②计算机采用二进制表示方法。

③本章主要介绍整数和浮点数两种数据类型.

2.2 整数数据类型

2.2.1 无符号整数

使用bit来表示无符号整数,例如$(1010)_2= 1*2^3+0*2^2+1*2^1+0*2^0=(10)_{10}$,所谓无符号就是指整数的二进制表示中的最高位(最左边的那位)不表示整数的正负,也就是说只表示非负数。

k个bit可以表示$2^k$个无符号整数,表示范围为$0-2^{k-1}$.

2.2.2 有符号整数

对于有符号整数,一共有三种表示方法,分别是:符号位表示法、反码表示法、补码表示法。

2.2.2.1 符号位表示法

以最高位表示符号,即0表示整数,1表示负数。以n个bit为例,表示范围为:

$[-2^{n-1}+1,-0]\cup[+0,2^{n-1}-1]$

2.2.2.2 反码表示法

将一个正数的所有bit位取反,得到该正数所对应的负数编码。正数的反码表示是它本身。

以n个bit为例,表示范围为:$[-2^{n-1}+1,-0]\cup[+0,2^{n-1}-1]$

2.2.2.3 补码表示法

①正数的反码表示是它本身,负数的补码表示等于它的正数补码表示取反加1。

$-x=\widetilde{x}+1 $

②负数的补码等于它对应的正数减一后取反。

$\widetilde{x}+1=\widetilde{x-1}$

③负数的补码表示等于:在它对应的正数补码中,在从右往左数的第一个1的左边的所有bit取反后的二进制表示,从右往左的第一个1及其右边的bit保持不变(这种方法最常用)。

只有在补码表示中,正数和对应的负数相加,它们的结果才为0,在其他两种表示方法种都不为0

补码的表示范围为:以n个比特为例,$-2^{n-1}-2^{n-1}-1$

注意:$(10000)_2$表示-16。

2.3 二进制与十进制之间的转换

2.2.3.1 二进制数转换为十进制数

2.2.3.2 十进制数转换为二进制数

方法:除二法。每次都除以2,如果余数为1,则在二进制表示的左边添加1,否则添加0。一直重复,直到商为0。

原理:如果一个二进制数是奇数,那么它的最低为一定为1;如果为偶数,则最低位为0。

string transformation(int n)
{
        string result="";
        while (n)
        {
                if (n % 2 == 1)
                    result += "1";
                else
                    result += "0";
                n /= 2;
        }
        result.reserve();
        return result;
}

2.4 十六进制计数法

当二进制表示太长的时候,可以用十六进制来表示。基本思想是把二进制中的四位看成一位,例如

二进制中的(0011 1101 0110 1110)对应十六进制中的(3D6E)。

十六进制数是基为16的表示方法,如$(3D6E)=3*16^3+13*16^2+6*16^1+14*16^0$

二进制表示

十进制表示

十六进制表示

0000

0

0

0001

1

1

0010

2

2

0011

3

3

0100

4

4

0101

5

5

0110

6

6

0111

7

7

1000

8

8

1001

9

8

1010

10

A

1011

11

B

1100

12

C

1101

13

D

1110

14

E

1111

15

F

2.5 bit运算之一:算术运算

2.5.1 加法和减法

二进制的加法与十进制的类似,依然是按位对齐,从右向左加,满二进一,即每位最大数是1

如果是减法,则把减数转换成对应的负数,再进行相加。也就是说把减法转换成加法。如,

$A-B = A+(-B)$

如果一个数乘以2,相当于把它的二进制表示左移1位;类似的,如果一个数除以2,相当于把它的二进制表示右移1位。

计算两个二进制数的加法时,先考虑它们对应的十进制相加的结果再考虑它们相加结果的二进制表示。

2.5.2 符号扩展

定义

在二进制正数前面添加任意多个0不会改变其值,在二进制负数前面添加任意多个1也不会改变其值

应用

主要应用于两个不同长度的二进制数相加的场合。

2.5.3 溢出

当两个二进制数的运算结果超过二进制所能表示的最大范围时,会发生溢出。换句话说,就是当最高位进位时,最高位的进位被丢失了,这种情况就叫做溢出。

只有同符号数相加才会发生溢出,一正一负的数相加是不会发生溢出的,因为正数和负数相加的结果是一定在取值范围内的。

如果两个同符号数相加发生了溢出,那么它们相加的结果的最高位与它们的最高位是相反的。如,

$(01001)_2+(01011)_2=(10100)_2$,此时,结果的最高位是1,说明两个正数相加等于一个负数,明显发生了溢出。

2.6 bit运算之二:逻辑运算

2.6.1 “与”运算

“与”(AND)是一个二元运算符,需要两个源操作数,并且每个操作数的值要么为1,要么为0。如果两个源操作数同为1,则AND的输出结果为1;否则,输出结果都为0。

真值表如下:

A

B

AND

0

0

1

0

1

1

1

0

1

1

1

1

2.6.2 “或”运算

“或”(OR)也是一个二元运算符,它的两个源操作数都是逻辑变量,取值为0或1。如果两个源操作数中有任意一个为1,则OR的结果为0;只有两个源操作数都为0,结果才为0。

A

B

OR

0

0

0

0

1

1

1

0

1

1

1

1

2.6.3 “非”运算

“非”(NOT)运算是一个一元运算符,只需要一个源操作数。输出是输入按位取反的结果。

A

NOT

0

1

1

0

2.6.4 “异或”运算

定义

“异或”(XOR)是一个二元运算符,需要两个源操作数。如果两个输入值不同,则XOR输出为1;如果两个输入值相同,则XOR输出为0。

A

B

XOR

0

0

0

0

1

1

1

0

1

1

1

0

性质

①任何数异或0等于它本身。

②如果A是一个偶数,那么A^1=A+1;如果A是一个奇数,那么A^1=A-1。

应用

变量交换

void swap(int& a, int& b)
{
        a ^= b;
        b ^= a;
        a ^= b;
}

2.7 其他类型

2.7.1 位矢量

假设存在n个单元,我们就用n个bit来表示这b个单元的状态。当某个单元空闲时,我们将相应的bit置1;当某个单元忙碌时,我们将相应的bit清0。我们称这个二进制数为“位矢量”。

我们在改变某个单元的状态的时候,需要使用屏蔽字。如,当$A=(1011)$时,我们想要改变第二个单元的状态,那么我们就让$A and (1101)_2 = (1001)$。屏蔽字的作用就是让我们能够在不改变其他bit的前提下,清除位矢量中的某一位。

2.7.2 浮点数

常见的浮点数为“float”类型(IEEE浮点数),由32-bit组成,各bit的定义如下:

符号:1bit,代表符号(0为正数,1位负数)

数值范围:8bit,代表范围(指数)

数值精度:23bit,代表精度(尾数部分)

尾数部分被正则化,即小数点左边有钱仅有且仅有一个非0数字,因为在二进制表示中,这个数字只可能是1。所以这个1就不必表示出来。也就是说在,在浮点数中,那个必然存在的1被省略了。

取值范围:

32-bitIEEE浮点数能表示的最大数值是$(2-2^{-23})\times2^{127}$,最小数值是$-(2-2^{-23})\times2^{-127}$

注意:

①当指数全为0的时候,小数点左边默认数字是0,不是1。所以IEEE浮点数可以表示非常小的数。

②当指数部分全为1,并且尾数部分全为0的时候,表示的是无穷大,符号取决于最高位的1。

③如果指数部分全为1,而尾数部分不全为0,则表示不确定的数,即NAN。

如何把十进制小数转换成二进制?

乘二法。主要是小数部分乘以2,去整数部分从左往右放在小数点后面,直至小数点后为0。

已0.125为例,

0.125*2=0.25,取0

0.25*2=0.5,取1

0.5*2=1,取1

所以$(0.125)_{10}=(0.001)_2$

2.7.3 ASCLL码

ASCLL码是一种二进制编码,用于将字符和数字相互转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值