计算机基础知识(一)

计算机基础知识(一)

本章目录

1.什么是位(bit),字节(Byte),字(word),字长?

2.有符号数和无符号数。

3.机器码,真值,原码,反码,补码

4.原码反码补码的转换

5.计算机中为什么要以补码形式参与运算或存储?

6.什么是逻辑移位?什么是算术移位?

7.溢出

8.计算机对溢出的处理[待补充]

9.溢出的判断方法

10.什么是符号位拓展,原码,反码,补码数值是否发生变化?

1.什么是位(bit),字节(Byte),字(word),字长?

位(bit)
数据存储的最小单位。在计算机中的二进制数系统中,位,简记为b,也称为比特,每个0或1就是一个位(bit)。
计算机中的CPU位数指的是CPU一次能处理的最大位数。如8位CPU,一次只能处理一个8位的数据或者8位的指令。32位计算机的CPU一个周期可以处理32位数据或8位的指令。

字节(Byte)
Byte简称B,也就是字节,每个字节由8个位(bit)组成,是计算机存储信息的最基本的单位一个汉字由两个字节组成。字母和数字由一个字节组成
除了字节之外还有其他单位,从小到大依次是:字节(B),千字节(KB),兆字节(MB),千兆字节(GB),千千兆字节(TB),转换关系为:
1TB = 1024GB
1GB = 1021MB
1MB = 1024KB
1KB = 1024Byte
数据存储以字节(Byte)为单位,数据传输大多以位(bit)为单位

字(word)
在计算机中,一串数码作为一个整体来处理或运算的,称为计算机字,简称字。字通常分为若干个字节(每个字节一般是8位)。在存储器中,通常每个单元存储一个字。对于不同位数的计算机,字的大小往往不同。如对32位计算机和64位计算机:
32位计算机:1字=4字节=32位
64位计算机:1字=8字节=64位

字长
计算机的每个字所包含的位数(bit)称为字长计算机的字长是指它一次可处理的二进制数的数目。一般地,大型计算机的字长为32~64位,小型计算机为12~32位,微型计算机为4~16位。字长是衡量计算机性能的一个重要因素。

2. 有符号数和无符号数

无符号数(unsigned number):指的是整个机器字长的全部二进制位均表示数值位,相当于数的绝对值。
其中无符号数的取值范围为:0~2n-1。

有符号数(signed number):一般用最高有效位(MSB)来表示数的符号,正数用0表示,负数用1表示。
有符号数(补码表示)的取值范围是:-2n-1~2n-1-1

有符号数中:

最小值为:1000_0000_0000_0000_0000_0000_0000_0000_B(-231D)

最大值为:0111_1111_1111_1111_1111_1111_1111_1111_B(231-1D)

0表示为:0000_0000_0000_0000_0000_0000_0000_0000_B

-1表示为:1111_1111_1111_1111_1111_1111_1111_1111_B(FFFF_FFFF_H)

注:无论是有符号数还是无符号数,它的二进制表示肯定都是唯一的。

3. 机器码,真值,原码,反码,补码

机器码
一个数在计算机中的二进制表示形式,叫做这个数的机器码机器码是带符号的在计算机中用一个数的最高位存放符号位正数为0负数为1

如十进制中的数1,假如计算机字长为8位,转换成二进制就是0000_0001;如果是-1,机器码为1000_0001(原码)。那么0000_0001,1000_0001就是机器码。机器码包含原码,反码和补码三种表示形式

真值

将带符号位的机器数所表示的真正的数值称为机器数的真值,也就是该机器码代表的真正的数值。因为有符号数最高为表示的符号位,所以其值并不等于其代表的值(将其解读为无符号数)。

如-1的机器码为1000_0001(原码),1111_1110(反码),1111_1111(补码),如果将最高位不解读为符号位,那么它们分别代表的无符号数十进制数129(无符号数),254(无符号数),255(无符号数)。其中-1为1000_0001(原码),1111_1110(反码),1111_1111(补码)的真值。简单理解就是有符号的真值(实际代表的数)需要按照一定的转换规则(是按原码,反码还是补码进行解码)将机器码进行解析得到,如果转换规则不同,则得到的数值可能不是真值。

原码

最高位表示符号位,其余位表示该数的绝对值。简而言之是最高位符号位+该数值的绝对值。

用原码表示数,可见有两个0:
+0:0000_0000_0000_0000_0000_0000_0000_0000_B

-0:1000_0000_0000_0000_0000_0000_0000_0000_B

231-1D(0111_1111_1111_1111_1111_1111_1111_1111_B)为正负分界线

绝对值相等的正数负数除去最高位,其他位均相同。

反码

正数的反码是其本身负数的反码为符号位为1,其余位是在其原码的基础上各位取反

相比与原码,用反码表示数,正数部分没有变化,负数部分相比原码表示头尾颠倒(因为对其数值位进行取反)。

对二进制数取反与代表数值求补数(余数)的关系[待补充]???

补码
正数的补码是其本身负数的补码符号位为1,其余位补码是在原码的基础上,各位取反,然后+1得到

下面给出4bit数值的原码,反码,补码对照表:

十进制数原码反码补码
0000000000000
+1000100010001
+2001000100010
+3001100110011
+4010001000100
+5010101010101
+6011001100110
+7011101110111
-1100111101111
-2101011011110
-3101111001101
-4110010111100
-5110110101011
-6111010011010
-7111110001001
-8100011111000

4. 原码反码补码的转换

由于正数的原码,反码,补码均相同,所以以下各转换均分为正数和负数的情况进行讨论。

原码反码转换

原码转换为反码

正数的原码就是其反码。

负数的反码为其原码符号位保持不变(1),其余为取反得到。

例:-1的原码为1000_0001_B,求其反码?

最高位保持不变其余位取反得到反码为1111_1110_B。

反码原码转换

正数的反码就是其原码。

负数的反码可以使用逆向运算,符号位不变,其余位取反。

例:-1的反码为1111_1110_B,求其原码?

符号位保持不变(1),其余位取反得到原码1000_0001_B。

原码补码转换

原码转换为补码

正数的补码和它的原码相同。

负数的补码是将原码的符号位保持不变(1),其余位取反,然后+1,得到其补码。

例:求-1的补码?

-1的原码为1000_0001_B,符号位保持不变,其余位取反得到1111_1110_B,然后+1,得到补码1111_1111_B。

补码转换原码

如果补码的符号位为0,表示的是一个正数,其原码就是补码。

如果补码的符号位为1,表示的是一个负数。有两种求补码的方式。

A. 补码的补码就是要求补码的原码。

B. 逆向运算,将补码-1,再将符号位保持不变(1),其余位取反得到的就是该补码的原码。

例:-1的补码为1111_1111b_B,求其原码?

按A方法:求-1补码的补码。符号为不变,其余位取反得到1000_0000_B,再将其+1得到原码为1000_0001_B。

按B方法:逆向运算,-1的补码先减1得到1111_1110_B,再将其符号位保持不变,其余为取反得到1000_0001_B。

特殊的,对于-256,补码为1000_0000_B,按第二中情形求原码,符号位不变,其余位-1,反码应为1111_1111_B,可以理解为向高位借1,但最高为符号位的值仍然是1而不是0。对其余位进行取反得到-256的原码为1000_0000_B。按照第一种情形来计算原码,即补码的补码是其原码,最高位保持不变,其余位取反得到1111_1111_B,再将其+1(有进位,最高位为符号位保持不变1,进位舍去),得到-256的原码为1000_0000_B。(以上是自己的理解,可能不是标准解释,因为-256的补码由-0得到,所以-256的补码是特殊情况,补码和原码可以不使用此转换规则进行转换,进行特殊情形进行记忆)

反码补码转换

反码转换为补码

正数的反码与补码相同。

负数的反码+1就是其补码。

补码转换为反码

正数的补码与原码相同。

负数的补码-1就是其反码。特别的,对于-8的补码为(1000b)转换为原码时。符号位不变,-1得(1111b)。

即出现000需要-1的情形,各位取反的到111,符号位需保持不变为1。

注:二进制数在内存中是以补码的形式存放的。

5. 计算机中为什么要以补码形式参与运算或存储?

CPU是由运算器,寄存器,总线构成。运算器简而言之就是一个个小的开关构成的集成器,每一个开关的状态代表0和1,每一次运算都是由时钟脉冲将这些状态带出来或存储在寄存器中。对于一个有符号的真值转换成机器码做运算,如果让计算机集成器中一个个小开关取保存这些状态,每个集成器上还要预留一个开关做为正负,并且其余开关进行转换的过程还要兼顾符号开关的状态,运算过程较为繁琐。解决方法是,能不能将真值中的符号位直接参与到运算中,这样就可以不用在硬件中专门预留一个符号开关标志。根据运算法则,减去一个正数等于加上一个负数,如1-1=1+(-1)=0,所以计算机可以只有加法而没有减法,这样计算机的运行的设计就变得简单了。

如计算十进制数1-1=0,以下分别给出原码,反码,补码计算过程。

原码计算

1-1=1+-1=[0000_0001]+[1000_0001]=[1000_0010]=-2

如果用原码表示,让符号位也参与计算,对于减法而言,结果是不正确的

反码计算

1-1=1+-1=[0000_0001]+[1111_1110]=[1111_1111]=[1000_0000]=-0

发现用反码计算减法,结果的真值部分是正确的问题出现在0这个特殊的数值上,用反码编码会出现+0[0000_0000]反和-0[1000_0000]反,但是-0是没有任何意义的

补码计算

1-1=1+-1=[0000_0001]+[1111_1111]=[0000_0000]=[0000_0000]=0(溢出的高位丢弃)

使用补码的编码方式,0的补码为[0000_0000],反码中-0不存在了,[1000_0000]补表示的是-128。注意:实际上使用-0的补码来表示-128,所以-128并没有原码和反码的表示。(对-128的补码表示[1000_0000]计算出来的原码是[0000_0000],这是不正确的)

6. 什么是逻辑移位?什么是算术移位?

移位运算

移位运算是将数值向左向右移动,对于十进制来说就是实现放大10倍和缩小10倍的效果,对于二进制来说就是放大2倍和缩小2倍的效果。

逻辑移位
对于逻辑移位,就是不考虑符号位,移位的结果是数据所有的位数进行移位。根据移位操作的目的,左移时,舍弃高位,低位补0;右移时,舍弃低位,高位补0。例:
0101_0101 >> 3 = 0000_1010
0110_1011 >> 3 = 0000_1101

因逻辑右移不考虑符号位,假如一个负值进行逻辑右移,则会出现变成正值的情况。例:
1000_0101 >> 1 = 0101_0010(正值)

算术移位
算术移位是考虑数据的符号位,所以不能直接移动所有的位数,分为有符号型值和无符号型值。

无符号数据:算术移位等同于逻辑移位

有符号数据:算术左移等同于逻辑左移,算术右移补的是符号位,正数补0,负数补1

7. 溢出

由于整数在内存里保存在一个固定长度的空间内,它能存储的最大值和最小值是固定的如果我们尝试去存储一个数,而这个数又大于这个固定的最大值时,就会导致整数的溢出

以下讨论发生溢出的情形

计算机中说的溢出(OF)一般是指补码模式的加减运算的条件下。补码模式有几个计算,转化规则:

-[X] = [-X]
+[Y] = [+Y]
-[-[X]] = [X]

加减运算的可能组合有以下情形:
对加法来说:

[] + []
[] + []
[] + []
[] + []

对减法来说:

[] - []		相当与[] + []
[] - []		相当于[] + []
[] - []		相当于[] + []
[] - []		相当于[] + []

可见所有减法都可找到对应的加法情形,那么就只看加法

对于一个有N为的二进制补码,其能表示的数字范围是:-2(N-1) ~ +2(N-1)-1
负数:-2(N-1)~-1
正数:1~2(N-1)-1
**对于加法来说,[正]+[负]或者[负]+[正]的情形永远都不会发生溢出,不管两个操作数取值多少,结果都落在有效范围内。**而超出有效范围的两种可能性就是:

[] + []
[] + []

定义两个事件
最高有效位进位:对于N位补码,第N-1位发生了进位
符号位进位:对于N位补码,第N位符号位发生了进位
定义4个边界值,以8位有效字长为例:
最大正值127D 0111_1111_B
最小正值1D 0000_0001_B
最小负值-128D 1000_0000_B
最大负值-1D 1111_1111_B

列出所有组合

情形符号位最高有效位是否发生溢出最高有效位进位符号位进位
[最小正] + [最小正]0000NNN
[最小正] + [最大正]0001YYN
[最小正] + [最小负]0100NNN
[最小正] + [最大负]0101NYY
[最大正] + [最大正]0011YYN
[最大正] + [最小负]0110NNN
[最大正] + [最大负]0111NYY
[最小负] + [最小负]1100YNY
[最小负] + [最大负]1110YNY
[最大负] + [最大负]1111NYY

结论:如果发生溢出操作,则最高有效位进位和符号位进位必然一个Y另一个是N。如果未发生溢出,则必然是两个全Y或者全N。这就是根据最高有效位和符号位发生进位异或来判断是否溢出的规律

8. 计算机对溢出的处理[待补充]

回绕
无符号数会回绕,对于unsigned整型溢出,C的规范是有定义的,溢出后的数会以2^(8*sizeof(type))作模运算,也就是说,如果一个unsigned char(1字符,8bits)溢出了,会把溢出的值与256求模
截断
将一个较大宽度的数存入一个宽度小的操作数中,高位发生截断

9. 溢出的判断方法

双符号位补码法
对有符号的补码进行计算
如果计算结果前两位是00,结果就是正数。
如果计算结果前两位是11,结果就是负数。
如果计算结果前两位是01,就是正溢出。
如果计算结果前两位是10,就是负溢出。

单符号位法
最高有效位有进位,符号位无进位→正溢出
最高有效位无进位,符号位有进位→负溢出

10. 什么是符号位拓展,原码,反码,补码数值是否发生变化?

符号位拓展是指计算机对应于小字节转化为大字节的规则

负数:当扩展一个负数的时候,需要将拓展的高位全赋1。

正数:对于正数而言,符号为拓展和零扩展是一样的,因为符号位就是0,即全填充0。

需要注意:负数拓展后,还是负数,且值不变;正数拓展后还是正数,值不变

原码,反码,补码进行符号位拓展后真值情况讨论

正数:由于正数原码,反码,补码相等,所以对于正数进行符号位拓展(高位补0),拓展后的原码,反码,补码真值均不变。

负数:对于负数,原码,反码,补码不相等,所以对于负数进行符号位拓展(高位补1),拓展后只有补码真值不变,原码,补码真值均改变。

结论机器码是由补码的形式存储才能保证正/负数进行符号位拓展真值不改变

参考文献:
https://blog.csdn.net/cg2258911936/article/details/103574604
https://blog.csdn.net/Xzg_2017/article/details/80158215
https://www.zhihu.com/question/22199029?sort=created
https://blog.csdn.net/qq_43511405/article/details/105899254
https://blog.csdn.net/weixin_42550185/article/details/117524464
https://blog.csdn.net/m0_58857034/article/details/121733387
https://blog.csdn.net/li0978/article/details/100714867
https://blog.csdn.net/m0_51402475/article/details/124809921

  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖小张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值