怎么把补码转换成十进制数

今天无意间看到有人问这个问题,顺便就引申开来为大家讲讲怎么把补码转换成十进制数,诸位看官请看:

class  Test
{
  
public static void main(String[] args)
  
{
    
int i = 0x7FFFFFF1;
    System.out.println(i);
  }

}

j的输出是多少呢?答案是14,下面为大家解答一下为什么。
当你在为变量赋值的时候如果用十六进制,那么其实你指定的是补码,因为我们都知道计算机中表示数是用补码形式表示的,在本题中也就是说变量i在内存中的表示形式是FFFFFFF1,那么j等于对i取反这一句,使得j在内存中的表示形式为0000000E,这时要输出j,其实是问“计算机里0000000E这样的一个数在十进制是多少呢?”,换句话说也就是要把反码是0000000E的这样的一个数换算成十进制,好,跟我来做,首先看最高位,0表示这个数是正数,我们知道正数的补码、原码、反码是一样的,所以就把这个数直接换算成十进制就可以了,也就是E×1=14×1=14,这道题目完成了。
我们再想一想,如果System.out.println(i)输出的是多少呢?类似上面讨论的,这条语句等价于问“内存中FFFFFFF1这样形式的一个数在十进制中是多少呢?”再来跟我做一下,首先看最高位,最高位是1,表示这是个负数,已知负数的补码求十进制和正数是有点不同的,第一步,所有位数取反,所以这一步后FFFFFFF1已经变成0000000E,第二步,转换成十进制,E×1=14×1=14,第三步,取倒数再减1,所以(14)倒=-14,-14-1=-15,结果就是这个数-15,大家看到这里应该明白负数补码怎么换算成十进制了吧,这里再给两个例子大家自己做做看,输出分别是什么呢?
e1.

class  Test
{
  
public static void main(String[] args)
  
{
    
int i = 0x8FFFFFF1;
    System.out.println(i);
  }

}

e2.

class  Test
{
  
public static void main(String[] args)
  
{
    
int i = 0xFFFFFFF1;
    
int j = ~i;
    System.out.println(j);
  }

}

 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值