java中的源码 反码 补码_[Java教程]关于源码,反码,补码(正数

[Java教程]关于源码,反码,补码(正数

0 2017-10-14 12:00:15

以一个字节为例

1、无符号位,一个字节可以存放0~255共256个数字;有符号位存放-128~127共256个数字;

2、无符号全都表示为正数;有符号位则首位表示正负数,正数首位为0,负数首位为1(因此在判断一个数为正还是负时会先看首位,如果为正直接算,如果为负还要经过求反码、        源码)

以下以默认的有符号位示例

3、首先,要知道计算机中正数用源码表示,负数用其正数的补码表示;补码为源码的反码加一(如-1即为1的反码加一表示)

1:0000 0001

-1:1111 1111

从1到-1的计算过程:0000 0001  取反码为  1111 1110

1111 1110   +1为补码  1111 1111

因此-1表示为 1111 1111

4、如果给你一个负数,要求你用二进制表示;

第一:先判断这个负数是否溢出(不管正负都要判断),如果溢出就不能表示,如果要强制转换就会造成数据不一致,那么原始数据就会丢失;

如果不溢出,就下一步;

第二:先用二进制表示出其对应的绝对值(正数)的二进制源码;

第三:根据源码求反码,源码取反(~源码);

第四:根据反码求补码表示负数,反码+1;

5、如果给你一个负数的二进制,求该二进制表示的负数为几;

第一:先求补码,该负数的二进制-1;

第二:根据补码求源码,补码取反(~补码);

第三:将源码算出代表几;

关于牛客网题目的理解(正确答案为 B)

bc91bb04e6e9c61e24c974e4440db8f2.gif

前言:不管什么都是按照上诉4、5计算;

比如4,当正数溢出时,他还是会把源码先(扩容后:如原本只装1个字节,但是装不下就扩用2个字节表示)表示出来,然后从低位截取再判断正负再进行计算;

当负数溢出时,他还是会将源码表示出来,然后根据规则算出补码,最后截取后存储。由于截取后数值就变啦,因此所表示的就不是原来的数了,至于表示几自己根                  据规则再算回去,有时甚至会变为正数就是这个原因;

因此这道题我是这么做的:

因为a为short类型,一共16位,表示128为:0000 0000 1000 0000

b为byte类型,一共8位,将a强制转换后为:1000 0000

为什么1000 0000表示-128呢,我自己的理解是:首先首位为1,则表示为负数 ,负数用补码表示,所以1000 0000为补码

补码-1为反码,即0111 1111

反码取反,为1000 0000

1000 0000表示的的正值为27=128(这样既符合正负数表示方法,数学数值上也说得通,包括16位的10000000 00000000表示-32768等等也是这个道理);所以1000 0000表示-128

总结:因此我认为通过负数二进制求其表示的数时,最后得出源码后,应该是求源码表示的正值;而1000 0000在byte中比较特别,因为它的补码与源码相同,所以最后得出源码时会比较懵逼,但如果记住这时该求正值就行了;以后自己按照这个计算方法计算便可以,方便好记 本文网址:http://www.shaoqun.com/a/329179.html

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:admin@shaoqun.com。

0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值