java中按位取反 ~5=-6

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

参照:https://bbs.csdn.net/topics/380129758

====================================================

更多的细节可看:

计算一个有符号的补码方式

http://blog.csdn.net/u010141129/article/details/23824469

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

laoyuan166

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值