Java打印整数与Integer.toHexString() : Different outputs

标签 java hex byte bit-manipulation bit

在确定 Java 如何存储和检索整数时,我遗漏了一些内容。我有以下代码

public class Test1 {
    public static void main(String args[]) {

        int a = 100;

        int negateA = (a | 0x80000000);

        System.out.println("Negative A: " + negateA);
        System.out.println("Negative A in HEX: " + Integer.toHexString(negateA));

    }
}

输出:

Negative A: -2147483548
Negative A in HEX: 80000064

从输出中,十六进制值对我来说很有意义,因为我设置了整数的最高有效位,而该值的其余部分指示其十进制值为 100,这就是我最初设置的值。

我不明白为什么当我只打印整数时我得到-2147483548

java 内部存储数字的方式和检索数字的方式有区别吗?

最佳答案

这不是从正数得到负数的方法! Java使用two's complement .

为了反转 int 的符号(无论它最初是正数还是负数),您可以:

~val + 1

对于longbyteshort也是如此。

唯一不起作用的数字是 0x80000000,即 Integer.MIN_VALUE,即 -2^31。但这是 n 位二进制补码表示的特征之一:它可以表示范围从 -2^(n-1) 到 2^(n-1) - 1 的数字。

以1为例:

0x00000001 // i = 1
0xFFFFFFFE // ~i
0xFFFFFFFF // ~i + 1 == -1

0xFFFFFFFF // i = -1
0x00000000 // ~i
0x00000001 // ~i + 1 == 1

关于Java打印整数与Integer.toHexString() : Different outputs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22596864/

相关文章:

java - "mappedBy reference an unknown target entity property"使用 hibernate

iOS - Xcode 中的 JPG "open as"十六进制

c++ - 将 float vector 转换为十六进制/二进制字符串

c++ - 为什么 DWORD 值通常以十六进制表示?

python - 通过 multipart/form-data POST 请求发送内存中的字节(文件)。 Python

java - 如何避免父pom受到maven依赖?

java - minimax 迭代加深搜索和 alpha-beta 剪枝停止时间为 5 秒

JavaBridge 不打开 php(无法连接到服务器)

java - 为什么Java中的字节范围是-128到127?

javascript - 何时使用 Uint8Array、Uint16Array、Uint32Array