【脸皮厚一点】组原

搬运  我对不起我们老师

 

1.什么叫做就近舍入:

《计算机硬件技术基础》第2章39页表2-5舍入控制中的就近舍入(偶)这个问题,对它不太明白,不知道什么意思。请您讲解一下,并且请您举个例子。

解答: 表的下面有一段文字进行了解释: 例如有效数字超出规定数位的多余数字是1001,它大于超出规定最低位的一半(即0.5),故最低位进1。如果多余数字是0111,它小于最低位的一半,则舍掉多余数字(截断尾数、截尾)即可。对于多余数字是1000、正好是最低位一半的特殊情况,最低位为0则舍掉多余位,最低位为1则进位1、使得最低位仍为0(偶数)。

注意这里说明的数位都是指二进制数。

举例:要求保留小数点后3位。

对于1.0011001,舍入处理后为1.010(去掉多余的4位,加0.001) 对于1.0010111,舍入处理后为1.001(去掉多余的4位) 对于1.0011000,舍入处理后为1.010(去掉多余的4位,加0.001,使得最低位为0)

对于1.1001001,舍入处理后为1.101(去掉多余的4位,加0.001) 对于1.1000111,舍入处理后为1.100(去掉多余的4位) 对于1.1001000,舍入处理后为1.100(去掉多余的4位,不加,因为最低位已经为0)

对于1.01011,舍入处理后为1.011(去掉多余的2位,加0.001) 对于1.01001,舍入处理后为1.010(去掉多余的2位) 对于1.01010,舍入处理后为1.010(去掉多余的2位,不加)

对于1.01111,舍入处理后为1.100(去掉多余的2位,加0.001) 对于1.01101,舍入处理后为1.011(去掉多余的2位) 对于1.01110,舍入处理后为1.100(去掉多余的2位,加0.001)

And:

2.类型问题

len应该改为int类型

无符号数的0 减一 还是无符号数的数 【无符号数表示范围为全零到全一】【0000-1=1111这个的】

所以i这个int类型和他比较就转成了无符号数之间的比较 而此时len-1变成了1111 无符号数的最大值 所以i会一直比他小的 恒成立 

所以会一直一直一直访问内存数组的该区域【C语言不检查下标越界情况】 ,内存保护机制

 

---------------------------------视频:加法器-----------------------------------------

在普普通通的计算时,对于有符号数,都是补码表示的,算出来还是补码,你想切回10进制数你得切回到原码啊【符号位不变 数字位取反 末尾加1/见一取反】

【128=1 000 0000 无原码和反码只有补码】【反码不用加1】

正数的原码反码补码都是一样,就是二进制表示 / 而负数的就是我们经常讨论的 负数的源码是符号位为1,数值位为其绝对值】【正数的符号位变1】 【求负数的反码:符号位不变 其余取反/要保持1嘛证明是负数】【补码:再+1

已知x的补码 求-x的补码 :-1取反===取反加1 顺序!

 

 

 最高数值位向符号位进位了[而符号位没有向其高位的进位]   导致超出2^n    这是很常见的 要注意范围的题目

8位计算机数值表示范围:-128-+127

溢出的两种情况:

  

01表示超出了能表示的最大正数的范围  10表示超出了负数的最小表示范围  所以看到底结果为正为负看最高符号位

 举例如下

------所以在定点机中当运算结果溢出时,机器要通过逻辑电路自动检查溢出并进行中断处理------

 

小数的加减补码

纯小数在求它的原码、反码、和补码时方法和整数是一样的。

例如:X=-0.1011 系统要是规定为8位,那么它的原码为  [x]原=1.1011000 [x]反=1.0100111 [x]补=1.0101000 

这里是用双符号位在表示:【补图】

 

为什么机器数是80 00H  为什么改成无符号unsigned之后由负的32768改为了+32768:

 解释:

 

计算机为什么要用补码存储整型,关于-32768的问题

https://blog.csdn.net/novofly/article/details/84436779

数值的补码表示也分两种情况: (1)正数的补码:与原码相同。 例如,+9的补码是00001001。 (2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。 例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码0000111按位取反为1111000;再加1,所以-7的补码是11111001。

 

计算机为什么要用补码存储整型

这得从二进制的原码说起: 如果以最高位为符号位,二进制原码最大为0111111111111111=2的15次方减1=32767 ,最小为1111111111111111=-2的15次方减1=-32767 此时0有两种表示方法,即正0和负0:0000000000000000=1000000000000000=0 所以,二进制原码表示时,范围是-32767~-0和0~32767,

因为有两个零的存在,所以不同的数值个数一共只有2的16次方减1个,比16位二进制能够提供的2的16次方个编码少1个。

 

但是计算机中采用二进制补码存储数据,即正数编码不变,从0000000000000000到0111111111111111依旧表示0到32767,而负数需要把除符号位以后的部分取反加1,即-32767的补码为1000000000000001。 到此,再来看原码的正0和负0:0000000000000000和1000000000000000,补码表示中,前者的补码还是0000000000000000,后者经过非符号位取反加1后,同样变成了0000000000000000,也就是正0和负0在补码系统中的编码是一样的。

但是,我们知道,16位二进制数可以表示2的16次方个编码,而在补码中零的编码只有一个,也就是补码中会比原码多一个编码出来,这个编码就是1000000000000000,因为任何一个原码都不可能在转成补码时变成1000000000000000。所以,人为规定1000000000000000这个补码编码为-32768 所以,补码系统中,范围是-23768~32767。 因此,实际上,二进制的最小数确实是1111111111111111,只是二进制补码的最小值才是1000000000000000,而补码的1111111111111111是二进制值的-1【符号位不变 其余取反加一】

 

整型的宽度是一个字,也就是2个字节,16个二进制位,最高一位二进制位用来表示符号(正或负),那么剩下的15位来表示数值。

所以,有:【以下均是补码】

01111111 11111111是32767,最大的正整数

00000000 00000001是1

00000000 00000000是0

11111111 11111111是-1(不是-32767)

10000000 00000001是-32767(不是-1)

10000000 00000000是-32768(不是-0),最小的负整数

 

-32768在内存中的表示是10000000,00000000。过程是:先读入正值32768(10000000,00000000),再取反(01111111,11111111),再加1(10000000,00000000)

 

计算机表示数主要从运算方式的一致性来考虑。 比如00000000 00000001表示1很好理解,但是11111111 11111111为什么是-1呢? 按照二进制加法 11111111 11111111 + 00000000 00000001= 1 00000000 00000000 结果超出了整型的宽度,溢出部分被忽略,最后的计算机结果是00000000 00000000 那么换成十进制,?+1=0,所以11111111 11111111表示成十进制就是-1

 

第三章【上面也有点】

Short是2个字节 到int4个字节 需要拓展 

 

强制类型转换

四个字节:

FF FF 80 00 = 1111 1111 1111 1111 1000 0000 0000 0000【补码】==10进制:[切换回原码]:1xxxx… 1000 0000 0000 0000=-32768[看最后那有一组1000…就证明那块不用动 前面还是10互换]

两个字节的情况下 -32768 在计算机里表示[就是上面] 1000 0000 0000 0000--------   截断(长转短)是强行将高位丢弃

 指令集之间的关系:指令集分成两大类:CISC和RISC

X86:我们汇编课上学的8086汇编对应的是实模式【不需要考虑虚实地址的转换 操作系统的保护等等】 实际中都在保护模式下工作。

MIPS汇编语言和机器语言

             

妈蛋我直接在原本的博客上写新的笔记了  MIPS指令 【31:26】是操作码字段用于区分,只是R型指令要在加一个末尾的【5:0】用于辅助判断

【25:21】RS 【20:16】RT【15:11】RD是三个寄存器 占5位所以各自最多表示32个寄存器 【0:6】表示偏移地址 对于R型指令无意义。

       

 .............就是这么着对着写  我的天博客笔记颜色什么鬼。。                  汇编表示这是 目的寄存器,源寄存器,源寄存器

 加法器

算术逻辑部件ALU:  carryout:进位

 Mux是多路选择器,B’ : 0时是B,1时是-B。

低位的进位信号(cin)和sub是连用的 所以当sub=1时低位进1 运算数是a和-b【取反加一】,所以做的是减法运算【减法换成了补码】。

 

               

 

     2ty/6ty

 

       

 

      

 

 

了解一哈🆗 

 

 

 

这里是补码运算,所以P在计算完了一个 往右移了一位,之后再在最高位补数的时候,补0/1【取决于次高位】  最终结果1110 1110

看高四位是不是全是符号位来判断是否溢出

 

 

除法器

 

恢复余数除法:

       这里是用的双符号位,00-负:11

 

    

商是0.10110[Q5附近的那个] 余数是:00.10110[r5]   又因为移位了5次 所以2^-5

不恢复余数除法:

  

 最后一步如果商为0【余数是11.】 那也只能恢复余数再往下做

 以上的两个除法算法:基于原码   串行  符号单独处理

 

 

定点运算部件: 

ALU本身是不具备保存信息能力的

 

 

并行除法:

 

 

 

 

 移码相关知识

https://blog.csdn.net/u011240016/article/details/53010061

 1. 移码从何而来

知识点:

  • 大家知道浮点数的组成是:符号位+阶码+尾数。
  • 比较整数的方式:从高位到低位,逐位比较。
  • 负数的原码,补码,反码的机器数都比正数大。

要知道

  • 在cpu内,电路越简单越好。
  • 而浮点数的运算经常有比较接码大小这种操作。
  • 阶码只有整数,而通常定点整数的比较方式:数值位就是从左往右逐位比较。然而,无论阶码采用补码、原码都不行,因为无论补码还是原码,负数机器码都比正数大。
  • 为了复用电路,采取比较定点数的方式来比较解码,于是设计了一种编码,真值和机器码是正比关系,由此引出了移码

 浮点数的运算

Xxx,s:针对单精度浮点数   xxx.d:针对双精度浮点数

编号为2的单精度浮点寄存器【编号从0开始】:¥f2

 

 

 

 

      向大端对齐

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

 

 

 

posted @ 2020-04-27 20:44  像走了一光年  阅读(406)  评论(0编辑  收藏  举报