摘要:本文旨在深入探讨整数在计算机中的二进制表示形式以及涉及的源码、反码和补码的运算原理。我们将介绍二进制数的基本概念,解释源码、反码和补码的定义和转换规则,并探讨在运算过程中它们的作用和区别。通过详细的解释和示例,我们希望读者能够全面理解这些概念,并正确应用于实际的计算和编程中。
计算机中数字用二进制表示,即为0,1组成。8比特就是由八个0,1组成的数字。
先说概念,源码就是数字转为二进制表示
例如1(默认8位),用二进制表示为0000 0001,通常有符号数第一位是符号位用来表示正负数。0表示正数,1表示负数。此时-1表示为1000 0001
反码:正数的反码是其本身,1的源码为0000 0001反码为0000 0001。对于负数反码是除了第一位(符号位)外都按位取反,即0变1,1变0。-1的反码为1111 1110
补码:补码就是在反码基础上加一。正数的补码是其本身。负数的补码是在反码的基础上加1。
-1的补码1111 1111
关于为什么引入源码反码补码的概念:
引入源码、反码和补码的概念是为了简化计算机中的整数运算。通过使用补码,可以将减法运算转化为加法运算,从而简化了运算的逻辑。此外,补码还可以解决源码和反码中的数值溢出问题,使运算更加可靠和一致。
【原】0000 0001 +【原】1000 0001 = 【原】1000 0010 = -2;不符合
【反】0000 0001 +【反】1111 1110 = 【反】1111 1111=【原】1000 0000 = -0;不符合
【补】0000 0001 +【补】1111 1111 = 【补】10000 0000 =【补】0000 0000 =0;符合
这样就使用加法解决了减法的问题。
补充
例如
让i = 2,147,483,647 b =1,073,741,823,java中(i+b)/2为负数而(i+b)>>>1为正数
在Java中,>>
和>>>
都是右移位运算符,用于对整数类型的数据进行位移操作。它们的主要区别在于对符号位的处理方式。
-
>>
:有符号右移- 对于正数,
>>
和/ 2
运算效果一样,结果向下取整。 - 对于负数,
>>
运算会将符号位一起右移,保持负数的负号不变,结果也是向下取整。
- 对于正数,
-
>>>
:无符号右移- 对于正数,
>>>
和/ 2
运算效果一样,结果向下取整。 - 对于负数,
>>>
运算会将符号位也向右移动,但是不保留符号位,结果是一个正数。
- 对于正数,