【脸皮厚一点】组原
搬运 我对不起我们老师
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:
解释:
数值的补码表示也分两种情况: (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
第三章【上面也有点】
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
向大端对齐