3.1概述
计算机中的字(word)是由位(bit)组成的,因此,字可以表示为二进制的数字。尽管自然数(0,1,2等)既可以用十进制的形式表示,也可以用二进制的形式表示,但是其他一些常见的数又如何表示呢。
例如:
--负数?
--计算机中的字可以表示的最大的数是多少?
--如果某一操作所产生的结果比一个字所能表示的最大的数还大,那会出现什么情况呢?
--小数和实数如何表示?
需弄清的根本原理:硬件究竟是如何进行乘法或除法运算的?
本章目的就是要揭示这些基本原理:包括
--如何表示各类数字
--用什么算法来实现算术运算
--硬件是如何实现这些算法的
--在指令集中如何表示所有这些有关的内容
3.2有符号数和无符号数
我们可以通过各种基数(base)来表示一个数。人们通常习惯于10为基数,正如我们在第2章中所介绍的那样,在计算机中则更倾向于以2为基数
最低有效位:第0位
最高有效位:第31位
MIPS机器的字长为32位,故十进制取值范围:0 ~ 4294 967 295
整数除了可以用2的补码来表示之外,我们还可以用ASCII数字字符串来表示一个数字.如果要表示的数字为10亿,那么用ASCII数字字符表示法所需要的存储空间是用32位长的二进制表示法的多少倍?
解: 10亿就是1 000 000 000,需要用10个ASCII数字来表示,每个数字长度为8位.因此,所需的存储空间是用32位长的二进制表示法的(10 x 8)/32即2.5倍。除了需要更多的存储空间以外,对于注重方法表示的数字,硬件在做加法、减法、乘法以及除法等各种运算时,所执行的操作也比二进制表示法复杂的多。正是基于这些原因,计算机专家们才一致认为,在计算机中使用二进制表示法再自然不过了。
硬件可以设计为直接对二进制位模式进行加法、减法乘法以及除法等运算。如果这些运算的正常结果无法用硬件能提供的有效位表示出来,就称这种现象为溢出(overflow)。溢出发生时,操作系统和相应的程序必须决定如何处理这种现象。
计算机程序既要处理正数,也要处理负数,因此我们必须设计一种表示方法,用以区分正数与负数。最直观的方法是增加一个单独的表示正负的符号,这只要用一个二进制位就可以方便地实现;这种表示方法称为符号加绝对值表示法,又称为原码。如今所有的计算机都用2的补码来表示带符号的整数。2的补码表示法有一个很大的优点,即所有负数的最高有效位(MSB)为1.因此,只要检查一下最高有效位,硬件就能判断某个数是正数还是负数(将0当成正数)。这个特殊的位称为符号位(sign bit)。在重新考虑了符号位的特殊情况以后,我们仍然可以用各位的值与2的相应次幂的乘积之和来表示32位正数和负数。
有符号数的溢出现象:当二进制位模式最左端保留为与保留无穷多位时左端的位不同时,就发生了溢出。
有符号数与无符号数的区别不仅表现在算术运算上,还表现在将这些数据加载入寄存器的过程中。将有符号数写入寄存器时,需要用符号位填满寄存器左侧中多余的位——我们将这一过程称为符号扩展(sign extension)——其目的是为了使这个有符号数能以正确的表示存放在寄存器中。而无符号数装入时,只需将左侧剩余的位置全部填上0即可,因为其中的数据是没有正负之分的。将32位字长的数据装入32位宽的寄存器时,有符号数和无符号数的装入过程是一样的。MIPS机器提供了两种形式的字节装入指令:一种是带符号的字节装入(load byte, lb),它将要装入的字节看成一个有符号数,并用符号扩展寄存器左侧的24个剩余的二进制位;另一种无符号的字节装入(load byte unsigned, lbu)则将要装入的字节看作无符号的整数。由于C程序中通常是用字节来表示字符类型(character),很少将其当成带符号的断整数,

本文探讨了计算机如何表示负数、最大整数、溢出情况,以及有符号数和无符号数的区别。重点讲解了加法、减法和除法运算的原理,涉及浮点数的表示、运算方法和MIPS指令。还揭示了浮点数运算的精度问题以及常见误解和陷阱。
最低0.47元/天 解锁文章
1111

被折叠的 条评论
为什么被折叠?



