提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:以下是本篇文章正文内容,下面案例可供参考
一、原码
1.机器数
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1。
比如:十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。那么,这里的 00000011 和 10000011 就是机器数。
2.真值
因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
3.原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:[1111 1111 , 0111 1111]
即[-127 , 127]。原码是人脑最容易理解和计算的表示方式,跟机器数是一样的。
二、反码
反码的表示方法是:正数的反码是其本身,负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.
三、补码
对补码的解释一般是"对负数的绝对值按位取反再+1"。
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值。
1.在不考虑符号位的情况下
在没有符号位的情况下,负数无法用原码表示。
对于补码,更本质的解释是:对于负数,"若数据类型为n个二进制位,则补码为
" 。也就是说,这个补码其实就是
,只不过是对
取模之后的
。这样就能理解,为什么减去一个数等于加上这个数的补码,因为补码无非是这个数在模意义下的相反数。比如在四位的情况下,-1 对
取模为15,用二进制表示即为 1111 ,列举几种情况:
1.计算的结果为正,如3 - 2,用补码表示为:0011 + 1110 ,结果为 1 0001,即为,溢出了一位,不考虑,即结果为1。
2.计算的结果为负,如2-3,用补码表示为:0010 + 1101,结果为 1111 ,即为,即原值为-1。
2.在考虑符号位的情况下
用四位可以表示0000~1111,最高位为符号位,对于一个负数-2,原码表示为1010,补码表示为1110,可以发现和不考虑符号位的补码是一样的,1-2 用原码表示为 0001 + 1010,用补码表示为0001 + 1110,结果为1111(补),即,那么原值为-1,用原码表示为1001。
总结
其实补码就是一种映射,将负数映射到最高位为1的区间,因为对于负数来说,负数和映射之后的结果的性质是一样的,比如在四位的情况下,1001的补码为1111,2-1 补码结果为1 0001,去掉溢出即为1,1-2 补码结果为 1111,也就是补码的-1。
最重要的是,计算机可以直接使用补码进行二进制运算,不需要在意符号位。
本文介绍了计算机中二进制表示数值的方式,包括原码、反码和补码的概念。原码直接表示符号,正数与负数的机器数形式不同;反码是正数不变,负数除符号位外其他位取反;补码则是负数在原码基础上取反加1,用于简化计算。补码使得计算机可以直接进行二进制运算,而无需关注符号位。
1万+

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



