【java】取反 原码 反码 补码
首先要明确,在计算机中,整数是以补码形式的存储并参与运算,计算机中的没法直接做减法的,它的减法是通过加法来实现的,可以发现一个正数的原码和它相反数的原码相加不等于0,所以必须引进反码和补码的概念。
一.原码
1>.正数的原码就是它的本身 假设使用一个字节存储整数,整数10的原码是:0000 1010
2>.负数用最高位是1表示负数 假设使用一个字节存储整数,整数-10的原码是:1000 1010
二.反码
1>.正数的反码跟原码一样 假设使用一个字节存储整数,整数10的反码是:0000 1010
2>.负数的反码是负数的原码按位取反(0变1,1变0),符号位不变 假设使用一个字节存储整数,整数-10的反码是:1111 0101
三.补码
1>.正数的补码和原码一样 假设使用一个字节存储整数,整数10的补码是:0000 1010(第三次强调:这一串是10这个整数在计算机中存储形式)
2>.负数的补码是负数的反码加1假设使用一个字节存储整数,整数-10的补码是:1111 0110(第三次强调:这一串是-10这个整数在计算机中存储形式)
四.取反
在取反操作时,是将数字的补码,进行取反,若符号位是1,则取反后减一,再取反,若符号位是0,则直接取反公式**:~a=-(a+1)**
有这么一个题:1.求~9的结果是什么
解:9的二进制数表示 0000 1001
9的原码 0000 1001
9的反码 0000 1001
9的补码 0000 1001
按位取反操作 1111 0110
变为原码先减一 1111 0101
再取反 1000 1010 (-10)2. 求~-9的结果
-9的二进制数表示 1000 1001
-9的原码 1000 1001
-9的反码 1111 0110
-9的补码 1111 0111
按位取反操作 0000 1000
变为原码 0000 1000 (8) 因为正数的补码、反码、原码都是一个样