【Java】第一讲:计算机底层运算逻辑

一>原码,补码,反码

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

反码:对于正数来说,反码和补码都不变(与原码相同),负数的反码符号位不变,其余为按位取反

补码:正数的补码是其本身,复数的补码是在其反码上+1

二>原码,补码,反码存在的意义

1.原码正数的运算

        在计算机内存中,数据都是以二进制的形式存储的,在运算时数据也是以二进制的形式参与的。

        拿最常见的数据类型int来说,int在定义变量时向内存申请了4个字节(32个比特位)的大小用来存储数据。举个简单的例子:

int a = 2;

2在内存中以二进制的形式存储32个比特位

现在对2进行加法运算(+1为例)

 

依此类推我们发现无论是+1,+2,+3,本质上都是对二进制原码的一次次进位,而原码对于正数进行计算是不会有问题的,但是如果用原码对负数进行计算数据就会出现错误。

2.原码的弊端,反码的概念

        原码的弊端就是当计算的数据是负数时计算结果就会出错

int b = -4;

//-4的二进制形式:
10000000 00000000 00000000 00000100

//对-4加1

正确结果:-4+1=-3

二进制形式的错误结果:
10000000 00000000 00000000 00000101//实际二进制表现的是-5

不难看出,如果对负数用原码计算所得结果和与其正好相反,而反码就是为了解决原码不能计算负数的问题而出现的。

计算规则:正数的反码不变,符号位不变,其余数位按位取反(1变0,0变1)

利用反码计算负数的结果是完全正确的。

3.补码

        虽然反码能够解决负数运算的问题,但是当计算过程中符号位发生变化时就有出现了新的问题。这里方便书写取1个字节。

如图

利用反码计算便符号位时会出现两个0,这也导致后续的计算结果会比实际的结果小1,所以补码规定1111 1111为-1的补码

这样就解决了反码计算时的“跨0”问题。

三>总结

        原码是十进制数据的二进制表现形式,但是在负数计算时会出现错误,反码的出现解决了这个问题,而利用反码计算的结果如果跨0,跟实际结果也会有1的偏差,计算机中的存储和运行都是以补码的形式进行的。

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NiKo_sx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值