Q:浮点数中的阶码的阶符作用是什么 为什么不能统一让阶码为正数 只改变尾数的大小 这样还能多表示一位阶码
A:这个方法(去掉阶符)会导致尾数可以随意改变 比如我原本阶码数值部分是10(二进制) 现在改成100 相当于小数点向左移动了两位 而每移动一位意味着我需要更高精度(更多位)的尾数数值长度 反而得不偿失 所以阶符的负号可以带来更高的靠近0的精度 并且当尾数可以随意改变时 会出现同一个数有很多种编码方式的情况 最后如果真的将阶符代表的意义去除只考虑数值 也并没有多表示一位阶码 而是从原来的-2的n-1次方至2的n-1次方-1变成了0到2的n次方-1
Q:浮点数是连续的吗
A:
看湖科大的这张图 好像有一种浮点数是连续的错觉 但仔细想一想就知道固定位长的浮点数可以表示的浮点数的是有限个的 浮点数不是一个连续的区间 不能表示所有的小数
所以:
Q:计算机内部没有小数点 应该怎么区分定点小数和定点整数?
A:计算机本身不分辨,是“人”(程序员、编译器或指令集架构)提前约定好的。在数据存入计算机之前就已经约定好这组数据是整数还是小数了
对于 CPU 的加法器来说:它根本不在乎你是整数还是小数。它只负责把两串二进制按位相加。
Q:基数为2的规格化数不应该是小数点右边第一位为1吗 为什么在单精度浮点数中尾数最左边部分隐藏的1是在小数点左边的 而小数点右边的第一位不需要是0了
A:因为前面这个规则只是针对定点小数 对于浮点数采用的是IEEE 754 标准 两个没有关联
Q:算术移位中有两种算术左移方法 当发生溢出的时候两个结果是不一致的(数值一致但不同正负性) 哪个是对的
A:溢出之后的值是无效的 两个模型算出来的结果不一样但是不影响 对于CPU只要知道这是一个错误的结果就行 对于这一点两者是相同的 所以最终结果相同
Q:为什么在进行加法右移之后acc的最低位的值移动到了mq的高位中
A:一开始ACC存放的是被乘数和乘数最低有效位(最后一个1的位置)的值 这个值是最后结果的尾端 随着MQ中存放的乘数的每一位遍历完 结果的乘积是ACC和MQ的总长度 所以必须要将ACC的最低位移到MQ中 而不是丢掉 并且每一轮乘积只能保证最后一位以后都不发生改变 所以每次移动只能移动最后一位
Q:为什么这里yi+1-yi为0时部分积+0 如果按照正常的乘法运算 不应该是遇到0不变化 遇到1加上x的补码吗 为什么这里变成了1->0和0->1变化
A:第一个是原码的乘法 这个是补码的乘法
Q:这里如果x绝对值的补码+(-y的绝对值)的补码溢出了符号位不就变成0了吗 那不就成正数了
A:在除法的一步减法中:是正数(因为符号位被去除掉了 剩下的是被除数的绝对值)+负数 所以一定不会溢出
Q:为什么这个最后算出来的商恢复负的符号位只需要改变符号位即可而不是恢复成原码形式
A:这里进行的是原码除法 将数值位的绝对值单独分离出来进行除法操作 最后算出来的值也是无符号的值 所以只需要改变符号位即可
Q:小端方式存在的意义是什么 大端存储不是可以天然的将地址按顺序取出吗 为什么还要小端方式
A:大端更符合直觉 小端存储将低位有效字节放在低地址 在整数存储、指针类型转换、低位截取等场景下有一些工程上的便利 因此 现代许多通用处理器选择了小端作为内存字节序
Q:尾数舍入为什么会引起阶码上溢
A:保护位舍入可能会影响到隐藏位的溢出 为了规格化 需要进行右规 而右规是造成阶码上溢的原因