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