java中按位取反 ~5=-6。
原因:
这是因为整数在计算机中是二进制存储的。
java中 ~5=-6 ,而这个-6是输出到屏幕上,我们看到的是-6。
首先看对5求反,
5的二进制原码是:0000 0101,
取反之后是:1111 1010 ,得到的这个值在计算机中的存储原型也是 1111 1010,而要把这个结果显示出来,到计算机屏幕上就要转换成十进制,也就是说 1111 1010 是补码形式,
补码 = 原码取反 + 1。
补码要换算成对应的十进制就是
原码取反 = 补码 -1
所以 1111 1010 - 1 = 1111 1001, 然后再对 1111 1001 取反,得到 1000 0110,
所以 原码就是 1000 0110,对应的十进制就是 -6。
同样的,这样看也行:
-6在计算机中的存储为二进制补码形式,也就是说-6的补码是 1000 1010 (-6的二进制原码是:1000 0110,源码取反之后是 1111 1001,再加上1就是 1111 1010,这就是补码了)。
=========================================================
百度中同样的问题:
c语言中十进制5按位取反是多少
这个回答也是一个意思:
5的二进制是00000101,取反后是11111010,因为%d是按照有符号十进制数字输出,所以会把11111010按照有符号十进制数字处理,根据进制转换的规则对11111010先减一,再取反,得到00000110,即6,但是有符号数中的符号位是1,所以会输出-6。
参照:https://zhidao.baidu.com/question/877699155323215652.html
==============================================================
还有在java中:
System.out.println((byte)128)) = -128;
System.out.println((byte) 131) = -125;
这是因为:
byte只有8位 10000000根本就不是通过源码计算出来的 谈何取反
(byte)128 输出为-128
在System.out.println((byte)128));中128会被认为是int类型
它的补码是 00000000000000000000000010000000 不是10000000
(byte)128的存储为 10000000 而不是 00000000000000000000000010000000
在byte中 10000000(注意这是补码)比较特殊 没有任何源码在转补码时能转换为 10000000(在byte类型中)
人为规定 10000000 就是-128
换个一般的例子 存在对应源码的 比如说 System.out.println((byte) 131);输出为多少 这样计算
131 的补码是 00000000000000000000000010000011 从int到byte 去掉前面24个0 得到
(byte) 131的补码是 10000011
(byte) 131的反码是 10000010
(byte) 131的源码是 11111101
在byte中 源码是 11111101 的二进制整数是 -125
所以System.out.println((byte) 131); 输出 -125
参照:
====================================================