大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家讲的是计算机原理知识点-整数表示。 本系列痞子衡会给大家介绍一些关于计算机原理的有趣的知识点,今天是系列第一节课,痞子衡要讲的是计算机中最基础的知识,即整数数据表示法。 一、何谓进制 学过数字电路的朋友肯定知道数据的进制表示法,常见的有二进制、八进制、十进制、十六进制表示法。在现实生活中我们所用的数据表示法是十进制,即由0-9共10个数字表示所有数值。 二、整数编码2.1 正负数表示(原码) 数据在计算机中都是用二进制来表示的。对于无符号整数(正整数),比如uint8_t型,8个bit均为数据位,用二进制表示其范围为8'b00000000 ~ 8'b11111111(0~255),这种所有bit均为数据位以表示无符号整数的编码方式即为原码。 2.2 减法的实现(反码)数字电路里我们都听说过加法器,但没有减法器的说法,说明计算机实际上仅支持加法运算,对于正整数做加法运算用原码没有任何疑义。那么对于无符号整数做减法运算(等同于有符号数的加法运算)怎么实现?我们尝试着用原码来代入运算,比如129-7(即129+(-7)): 8'b10000001(129原码) + 8'b10000111(-7原码)-------------- = 8'b????????(符号位如何参与运算?) =9'b100001000(不区别符号位,直接运算,最高bit由于溢出被自动丢弃) = 8'b00001000(结果为8) 我们似乎遇到了困难,有符号运算数的符号位如何参与运算?如果我们不区别对待符号位,直接把它当做数据位进行计算,得出的结果显然是不对的,所以原码是无法被用作减法/有符号数的计算的。为了解决这个问题,此时引入了第二种编码方式规定(反码),即正数的反码与原码相同,负数的反码等于原码除了符号位外,其余数据位全部取反。有了反码,此时我们用反码重新计算129-7:
2.3 消除+/-0之争(补码)反码看起来似乎解决了减法问题,不妨让我们再做一个减法运算,比如5-5,我们尝试再一次用反码解决问题: 8'b00000101(5反码) + 8'b11111010(-5反码)-------------- = 8'b11111111(结果为反码) = 8'b10000000(转换成原码,根据有符号数原码编码规定解析为-0) -0是等于0的,运算的结果是对的,但是不是总感觉哪里不对?是的,原码8'b00000000表示+0,我们已经有+0来表示0了,再用-0表示0显得多此一举,浪费了一个编码值。怎么解决这个问题?此时引入第三种编码方式规定(补码),正数的补码与原码相同,负数的补码等于反码加1.那现在我们尝试用补码来重新计算5-5:
上述运算中使用补码消除了运算结果为-0的问题,但还是没有告诉我们8'b10000000的值到底是多少?显然不应该是-0,那么应该要怎么解析8'b10000000?有朋友说答案是-128,是的,前面我们已经在原码一节中给出了答案,那如何来理解这个答案?首先我们得要从标准原码定义的角度来说-128,按照定义-128的原码应该是9'b110000000,转换成补码还是9'b110000000,原码与补码一致,截断最高位后可得8'b10000000,讲到这里,我们似乎有点明白-128的由来了,但这样真的靠谱吗?代入运算会不会影响运算结果的正确性?我们来试试看-128+17: 8'b10000000(-128补码) + 8'b00010001(17补码)-------------- = 8'b10010001(结果为补码) = 8'b10010000(转换为反码) = 8'b11101111(转换为原码,由于最高bit为1,即表示负数,其值为-111) 由于用8'b10000000来表示-128参与运算并不会导致结果错误,那么何不直接约定用8'b10000000来表示-128呢?好,就这么愉快的决定了!这就是-128=8'b10000000的由来。其实就是计算机里的一个异常的人为规定而已! 2.4 编码小结 无论uint8_t/int8_t型数据全部使用补码的方式在计算机中进行存储,其中int8_t型数据范围内-128是个异常规定,无法用补码编码规则直接解释,但计算机可以自动理解识别。
至此,计算机原理知识点之整数表示痞子衡便介绍完毕了,掌声在哪里~~~ |
|
来自: 西北望msm66g9f > 《培训》