有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java打印加载了文件的字节。将所有字节读入数组

我正试图用java编写一个芯片8模拟器,我遇到了一个关于java FilesreadAllBytes函数的问题。当我将用于测试的ROM中的字节加载到模拟器的“内存”数组中时,我试图打印这些字节,以查看它们是否正确地进入内存。我使用Integer.toHexString将这些字节视为十六进制值,并将它们与使用十六进制编辑器加载的实际文件进行比较,但它给出的输出很奇怪:

文件的第一个字节:

00 e0 a3 4c

测试输出:

0 ffffffe0 ffffffa3 4c

代码:

public void loadToMem(byte[] program) {
    for(int i = 0; i < program.length; i++) {
        this.memory[i+512] = program[i];
        System.out.println(Integer.toHexString(this.memory[i+512]));
    }
    this.initializeComponents();
}

这些值只是Integer.toHexString给出的表示中的一个错误,并且这些值被正确加载了,还是它们真的被错误加载了?为什么用f填充


共 (1) 个答案

  1. # 1 楼答案

    Java中的byte值是有符号的8位值。因为e0a3都设置了它们的高阶位(它们有一个值>;=80十六进制),所以它们代表负值。然后,当您将它们传递给Integer.toHexString时,这些值将扩展为32位值。您看到的是这些负8位值的等效32位十六进制表示。这被称为Two's Complement表示法,这是最常用于表示计算机内存中有符号整数值的方法

    对于2的补码,带十六进制值e0的有符号8位(单字节)整数的十进制值为-32。-32十进制的有符号32位整数表示为ffffffe0十六进制。当你将二的补码正值扩展到更广泛的表示形式时,用0s填充。当你扩展负的二补码值时,用ff值填充。这与将两个补码值扩展到任意字节数时的工作方式相同

    当我们第一次看到负整数在计算机内存中的解释时,我们大多数人可能都同意你的观点,这“有点奇怪”

    这里有一个链接到simpler explanation of Two's Complement