原码 反码 补码及应用

原码 反码 补码及应用

原码

什么是原码?

原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负。

56 ==> 0 0111000

​ 符号位 数据

最大值:01111111 ==> 127

最小值:11111111 ==> -127

原码的数值计算

00000001 ==> 1

00000010 ==> 2

利用原码对正数计算是不会有问题的。

原码的弊端

10000000 ==> 0

我们对0 + 1,0+1=1

但1000000 + 1 为10000001 ,而10000001 ==> -1

在对负数进行运算时出现了错误,实际运算结果与预期结果是相反的。此时我们引入反码

反码

什么是反码

反码:正数的反码是其本身,负数的反码是符号位保持不变,其余位取反。

数值计算

计算规则:正数的反码不变,负数的反码在原码的基础上,符号位不变,数值取反,0变1,1变0。

-56 ==> 10111000 (原码)

​ 11000111 (反码)

-56 + 1 = -55

-55 ==> 11001000 (反码)

-55 <== 10110111 (原码)

反码的弊端

负数运算时,如果不跨0,没有任何问题,如果跨0,就会与实际结果有1的偏差

-4+4 = 0

-4 ==> 10000100(原码) 11111011(反码)

+4 = 11111111 (反码)== > 10000000 (正码)==> -0

-4+5 = 1

-4 ==> 10000100(原码) 11111011(反码)

+5 = 00000000 (反码)== > 00000000 (正码)==> +0

所以引入补码

补码

什么是补码

补码:正数的补码是其本身,负数的补码是在其反码的基础上+1。

十进制数字原码反码补码
+0000000000000000000000000
-0100000001111111100000000
-1100000011111111011111111
-2100000101111110111111110
-3100000111111110011111101
-4100001001111101111111100
-127111111111000000010000001
-12810000000

补码出现的目的

为了解决负数计算时跨0的问题而出现的。

计算规则

正数的补码不变,负数的补码在反码的基础上+1

另外补码还能多记录一个特殊的值-128,该数据在一个字节下,没有反码和原码、

补码注意的点

计算机中的存储和计算都是以补码的形式进行的。

应用

强制转换

public class Test{
    public static void main(Strinf[] args){
        int a = 300;// 00000000 00000000 00000001 00101100
        byte b = (byte)a;
        System.out.println(b);// 00101100 ==> 44
    }
}

00101100 (原码)== > 00101100(反码)> 00101100(补码)> 44

public class Test{
    public static void main(Strinf[] args){
        int a = 200;// 00000000 00000000 00000000 11001000
        byte b = (byte)a;
        System.out.println(b);// 11001000 ==> -56
    }
}

11001000(原码)== > 10110111(反码)== > 10111000(补码)==> -56

其他运算符

运算符含义运算规则
&逻辑与0为false,1为true
|逻辑或0为false,1为true
<<左移向左移动,低位补0
>>右移向右移动,高位补0或1
>>>无符号左移向右移动,高位补0
&:逻辑与
public class Test{
    public static void main(Strinf[] args){
        int a = 200;// 00000000 00000000 00000000 11001000
        int b = 10; // 00000000 00000000 00000000 00001010
        System.out.println(a & b);
    }
}

​ 00000000 00000000 00000000 11001000

& 00000000 00000000 00000000 00001010


​ 00000000 00000000 00000000 00001000 ==> 8

|:逻辑或
public class Test{
    public static void main(Strinf[] args){
        int a = 200;// 00000000 00000000 00000000 11001000
        int b = 10; // 00000000 00000000 00000000 00001010
        System.out.println(a & b);
    }
}

​ 00000000 00000000 00000000 11001000

| 00000000 00000000 00000000 00001010


​ 00000000 00000000 00000000 11001010 ==> 202

<<:左移
public class Test{
    public static void main(Strinf[] args){
        int a = 200;// 00000000 00000000 00000000 11001000
        System.out.println(a << 2);//800
    }
}

在这里插入图片描述

>>:右移
public class Test{
    public static void main(Strinf[] args){
        int a = 200;// 00000000 00000000 00000000 11001000
        System.out.println(a >> 2);// 50
    }
}

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值