java中对一个整数进行取反后关于输出值的分析

在分析之前必须先明确如下几点:

1.Java是用补码来存储负数的,也就是说我们对一个数进行取反输出,输出的其实是一个在内存中以补码形式所存在的数;

2.原码,反码,补码的转换规则:{

(1)正数的原码,反码,补码完全一样即符号位固定为0数值位相同;

(2)负数的符号位固定为1,由原码转变为补码时的规则如下:  {

    (1)原码符号位为1固定不变,整数的每一位二进制数位取反得到反码;

    (2)反码符号位为1不变,在反码数值位最低位加1,得到补码。

  }

}

注:对一个数取反,得到的可不是它的反码哦!


举例:

public class Test{

      public static void main(String[] args){

                int a = 8;

                System.out.println(~a);//测试发现输出-9,而不是大多数人认为的7

      }

}

分析:

正数8的二进制表示如下:

00000000 00000000 00000000 00001000   (正数8的原码,补码,反码都是这串二进制数)

对正数8进行取反得:

11111111 11111111 11111111 11110111(*)

可以发现对正数8进行取反后由于符号位变成了1故得到了一个负数然而java存储负数时是用其补码来进行存储的即问题转化为求由于对正数8取反所得的负数存储问题!按照负数原码和补码转化规则:

1.(*)的符号位1不变,其它位取反得到反码:

     10000000 00000000 00000000 00001000

2.反码的符号位不变,反码的数值位最低位加1,得到补码:

     10000000 00000000 00000000 00001001(该串二进制数即为输出的-9)

以上就是为什么对正数8取反操作后输出的值为-9的原因。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.你自已决定是否需要有正负: 就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个...
    Xiho丶阅读 6,660评论 0 2
  • 一、二进制:所谓二进制就是逢二进一 (0,1), 因为使用二进制只有 0, 1 两个数,简单,易于电子方式实现 ...
    hello大象阅读 8,883评论 0 1
  • 到目前为止,我们学习了十进制、二进制、八进制、十六进制等用来代表实际数值的数,称为真值,这些数我们再日常生活中都会...
    codingriver阅读 27,948评论 4 14
  • 本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可...
    yang2yang阅读 6,965评论 1 13
  • These scars long have yearned for your tender caress 纤纤玉手...
    伊卡洛斯l阅读 4,681评论 0 51

友情链接更多精彩内容