资讯专栏INFORMATION COLUMN

从Java中的取反号‘~’看原码,反码,补码

Rainie / 2246人阅读

摘要:首先,存储的是有符号数,在计算机中,有符号数通常是使用补码存储的,也不例外。先来看看什么叫原码,反码,补码。例如原反补原反补分析所以回到一开始的问题,在计算机中是以补码存储的。

缘起

一次在写测试程序的时候,随手对2取了一个反,当时代码大意如下:

public static void main(String[] args) {
        int a = 2;
        System.out.println(~a);
    }

按照我当时的想法,觉得过程应该是这样的:

a = 2,也就是说a的二进制位10,取反就变成了01,所以结果应该为1。

但是实际的结果值是-3,于是就被打脸了。

知识普及

那究竟是为什么结果和我预期的不一致呢?这就要从计算机常用的几个码说起了。首先,java存储的是有符号数,在计算机中,有符号数通常是使用补码存储的,java也不例外。先来看看什么叫原码,反码,补码。

原码

原码就是符号位加上真值的绝对值,即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:

[+1]原 = 0000 0001

[-1]原 = 1000 0001

第一位是符号位. 正数符号位为0,负数为1。

反码

正数的反码是其本身
负数的反码是在其原码的基础上,符号位不变,其余各个位取反.
例如:

[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

补码

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

[+1] = [00000001]原 = [00000001]反 = [00000001]补

[-1] = [10000001]原 = [11111110]反 = [11111111]补

分析

所以回到一开始的问题,int a = 2 a在计算机中是以补码存储的。

对于2这个正数来说,补码、反码、原码都是相同的,又由于是数值型,在这里我先用八位bit来表示一下:

原码:0000 0010
反码:0000 0010

补码:0000 0010

取反
取反过程是在补码的基础上进行的,由于是按位取反,无论符号位还是数值位都要取反,所以结果如下:

取反后的补码: 1111 1101

换算为值
那么取反后的补码的实际值是多少呢?我们需要先把他转化为原码,过程如下:

反码 = 1111 1101 - 1 = 1111 1100

原码 = 反码符号位不变,其余取反 = 1000 0011

所以,最后的值-3

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65713.html

相关文章

  • Java位运算符浅析

    摘要:在学习源码中,发现有大量使用位运算符,这样做的目的是为了节约内存开销和加快计算效率。位运算符,这个位代表这什么位二进制位简称位,是二进制记数系统中表示小于的整数的符号,一般用或表示,是具有相等概率的两种状态中的一种。 在学习源码中,发现有大量使用位运算符,这样做的目的是为了节约内存开销和加快计算效率。 位运算符,这个位代表这什么? 位:二进制位简称位,是二进制记数系统中表示小于2的整数...

    zhaofeihao 评论0 收藏0
  • 数据的表示:原码反码补码、移码以及浮点数的运算

    摘要:而相应的,科学家们又提出了补码这一概念。因此在计算机中,为了避免运算错误,都是采用的补码进行加减法运算。原码反码补码移码数值表示范围在开始了解数值的表示范围之前,我们先来了解下什么叫做定点。 ...

    cnTomato 评论0 收藏0
  • 关于java中的强制类型转换和二进制表示问题

    摘要:中用补码形式表示第一位正负位,表示负,表示正。原码一个数的二进制表示。的补码是的补码是占个字节,位占个字节,位所以强转时会截断。 showImg(https://segmentfault.com/img/bVbsydY?w=993&h=471); 1、Java中用补码形式表示2、第一位正负位,1表示负,0表示正。3、原码:一个数的二进制表示。 3的原码0000...

    cyixlq 评论0 收藏0
  • 【深入浅出-JVM】(2):原码反码补码

    摘要:正数用填补,负数用填补。注不同的环境填补方式可能不同低位右移溢出则舍弃该位。感谢您的耐心阅读,如果您发现文章中有一些没表述清楚的,或者是不对的地方,请给我留言,您的鼓励是作者写作最大的动力。 计算机中有补码表示 0 0 为正数 原码 00000000 00000000 00000000 00000000 反码 00000000 00000000 00000000 00000000 ...

    qpwoeiru96 评论0 收藏0
  • 一文搞明白位运算、补码反码原码

    摘要:我们来看一个特殊的运算反码反码反码原码。补码为了解决反码的问题就出现了补码。用原码表示为用反码表示为用补码表示为,表示的补码左移一位后为,该补码对应的反码为该反码对应的原码为符号位不变,其他位取反,为,表示。 在平时看各种框架的源码的过程中,经常会看到一些位移运算,所以作为一个Java开发者是一定掌握位移运算的。 正数位移运算 Java中有三个位移运算: :右移 >>>:无符号右移 ...

    tunny 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<