我写了一个简单的程序,其中我有一个按位运算符,它在java中给出了有符号值。但是当我这样做时,它返回的值高于原始值。
class bit
{
public static void main(String[] args)
{
int j=10;
System.out.println("jjjj"+~j);
}
}
给出输出:
-11。其预期输出应为-9。有什么问题?
答案 0 :(得分:1)
如果我们查看数字10的二进制文件,我们可以看到
<00> 0000 0000 0000 0000 0000 0000 0000 1010
第一个0是签名位。
如果我们现在翻转二进制包含签名位,我们得到:
1111 1111 1111 1111 1111 1111 1111 0101
其中......如果你认为java使用有符号整数,则为-11。
如果我们离开有符号的数字一秒钟,只考虑一个4字节无符号整数的值~10,我们得到的值为:4294967285。
要将无符号整数转换为二进制补码有符号整数,我们将从整数中减去2 ^ 32的值,如果则超过2 ^ 31 - 1。
2 ^ 32 - 4294967285 = -11
答案 1 :(得分:1)
0000 1010 // = 10 i.e binary representation of 10
1111 0101 // = ~10 i.e inversion of bits
负数以2的补码形式存储。 Check this for details
0000 1011 // = 11 i.e binary 11
1111 0100 // inversion of bits
1111 0101 // 2's complement of 11 = -11
因此,
~10 = -11