模、原码和补码
作者:互联网
模、原码和补码
在实际生活中,如果一个物体在正北方向30度,把该物体顺时针旋转100度,和把这个物体逆时针旋转260度得到的效果是一样的。再比如说钟表,时针从2点走11个单位,和逆时针走1个单位的位置是一样的。这两个例子有个共同的特点,物体和时针都被限制在了一定的范围内,想要取到一个位置,都有两种方式。
- 第一个例子中30 + 100 的位置与 30 - (360 - 100)的位置是一样的。
- 第二个例子中,2 + 11并没有等于13,而是等于1,因为超过了一定范围以后,就会将计算结果减去这个“一定范围”的整数倍,使最终结果控制在这个范围里面。所以2 + 11与 2 - (12-11)的时钟位置是一样的。
类比这两个例子,可以理解计算机中模的概念。例子中的“一定范围”就是模。两个例子里面的100与360-100的关系、11与12-11的关系就相当于计算机中的原码和补码。
举例:
在第一个例子中,-30度可以表示为360-30度。那么同样,在计算机中,一个8位的二进制数的模就是 1 0000 0000(2^8=256)。-3可以表示为256-3。- -3的原码是
10000011
- 3的原码是
00000011
- -3=256-3表示为
1 00000000 - 00000011 = 11111101
11111101
就是-3的补码。
得到的结果11111101
就被叫做-3的补码,10000011(-3的原码)
和11111101(-3的补码)
就相当于-30度与330度的关系,虽然长得不一样,但是在二进制计算中表达的意义是一样的。这样11111101
就可以代替10000011
(-3的源码)进行计算机中的二进制计算。
补码存在的意义
反码的存在可以让计算机表示十进制中的负数,并且可以让计算机在运算时只做加法不做减法。
例如:10-3 = 10 + (-3)
在模的范围里,一个数本身与其补码具有相同的意义。在实际计算10+(-3)
时相当于10的原码 + (-3的补码)
的过程。(如果此时你有个疑问,为什么不直接用-3的源码来计算10+(-3),看了下面负数的原码的定义就知道了。)
负数的原码
八位二进制数0000 0000 ~1111 1111
,一共可以表示2^8=256位数。如果想要表示有符号整数,就要将最前面一个二进制位作为符号位,即0代表正数,1代表负数,后面7位为数值域,这就是原码定义。
这也就是为什么8位的二进制能表示十进制数的范围是
-128~+127
。而计算机在计算负数的加法不能用负数的源码计算也是因为原码定义。例如上面的
10+(-3)
,不能用-3
的源码计算,是因为-3
的原码与3
的原码只差了一个符号位,数值部分其实是和3
,这样计算的结果显然是不对的,所以要求-3的补码
,用补码来进行计算。负数在计算机计算时,都是使用其补码来进运算的。
反码
原码的符号位不变,二进制取反得到结果,只是计算机为了计算补码时的一个中间量。
各种码的计算方法
- 原码:符号位加上真实数值的绝对值的二进制, 即用第一位表示符号, 其余位表示数值。
- 反码:正数的反码是其本身;负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。
- 补码:正数的补码就是其本身;负数的补码是在反码的基础上+1。
上面例子中提到的求补码的方法是,用模的值减去负数的绝对值,那个模对应的二进制
1 0000 0000
是9位的,而8位的二进制是无法表示这个模的。计算机计算补码的真正办法是将原码的符号位不变,二进制取反加1。
标签:反码,二进制,补码,负数,0000,原码 来源: https://www.cnblogs.com/amxiang/p/16498877.html