首先你要知道现在我们用的多数都是32位机,所以整形数都是4个字节
那么再看看按位取反的结果:
00000000 00000000 00000000 00000101 这是5
00000000 00000000 00000000 00000000 这是0
11111111 11111111 11111111 11111111 这是-1
11111111 11111111 11111111 11111110 这是-2
11111111 11111111 11111111 11111101 这是-3
11111111 11111111 11111111 11111100 这是-4
11111111 11111111 11111111 11111011 这是-5
11111111 11111111 11111111 11111010 这是5取反的结果-6
看懂了吗?
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
比如 0000 0000 0000 0000 0000 0000 0000 0101是 5的 原码。
无符号的32bit整型最大值的二进制编码
和
有符号32bit二补码编码整型的-1的二进制编码
是一样的,就是说有不少前提。
Java的int是有符号的,只有int被当成无符号的时候,比如转成long的低32bit,
这时32bit最大值和和int的-1的二进制编码一样。
得看你的数据类型了,比如说你写12,默认的就是int的12
int是32位的
12=00000000 00000000 00000000 00001100
~12=11111111 11111111 11111111 11110011
第二个问题,有符号整数是按照最高位判断正负的(java中的数值除了char都是有符号的,都符合这个规则),如果x最高位是1,那么该数是负数,其值为 -((~x)+1),因此
11111111 11111111 11111111 11111111作为int型的话,因为最高位为1,所以其值为 -(0+1)=-1
根据上面的理论,~12=-(~(~12)+1)=-13
你用4位表示太少了,没法表示标志位。你可以用8位试试\x0d\首先给你讲讲负数是怎么存2进制的,就是将其正数部分取反后+1。那么,我们逆推回去,由负数(标志位是1,即首位是1)减去1,然后再取反,是不是就得到了负数的正数部分?\x0d\\x0d\5=00000101(B)\x0d\对5取 ~5 = 11111010(B)(首位是1,说明是负数)\x0d\然后减去1 = 11111001(B) \x0d\然后取反 = 00000110(B) = 6(D) 这就是结果的正数部分\x0d\你算一下最后的结果11111010(B)的正数部分是不是6呢?所以嘛~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,这就是补码了)。
以上就是关于JAVA中“~”按位取反运算符的一些问题。全部的内容,包括:JAVA中“~”按位取反运算符的一些问题。、求java中是否有对数值取反的函数、java中取反 *** 作是正数取反=正数+1取负 负数取反=负数+1取正,那么-1取反是等于0嘛等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)