java不将0xfc视为有符号整数?

smtd7mpg  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(378)

就在我认为我已经很好地掌握了java如何处理所有整数/字节等的时候。。作为有符号的数字,它击中了我与另一个曲线球,让我思考,如果我真的了解这种治疗毕竟。
这是一段汇编代码,如果满足某个条件(实际上满足了),它应该跳转到某个地址。就在跳转开始之前 C838h 然后经过条件检查,应该是: C838h + FCh (h=hex)我认为它会被视为有符号的,这样pc就会向后跳转: FCh = -4 in two's compliment negative number . 但令我惊讶的是,java在pc中添加了fch,使它错误地跳转到 C934h 而不是回到 C834h .

C832: LD B,04              06 0004 (PC=C834)
C834: LD (HL), A           77 9800 (PC=C835)
C835: INC L:00             2C 0001 (PC=C836)
C836: JR NZ, n             20 00FC (PC=C934)

我在java代码中对此进行了测试,结果确实是一样的:

int a = 0xC838;
int b = 0xFC;
int result = a + b;
System.out.printf("%04X\n", result); //prints C934 (incorrect)

为了解决这个问题,我必须在检查第一位是否为1后将fch转换为一个字节,即: 11111100 ```
int a = 0xC838;
int b = (byte) 0xFC;
int result = a + b;
System.out.printf("%04X\n", result); //prints C834 (correct)

简言之,我想我的问题是,我以为java会知道fch是一个负数,但事实并非如此,除非我将它转换为一个字节。为什么?对不起,我知道这个问题被问了很多次,而且我自己也问了很多。
yyhrrdl8

yyhrrdl81#

0xfc 是正数。如果你想要一个负数,那就写一个负数。 -0x4 就行了。
但如果您想将其应用于非常量数据,则需要告诉java您希望以某种方式对其进行符号扩展。
问题的核心是您有一个32位有符号整数,但您希望它被视为一个8位有符号整数。最简单的方法就是使用 byte 就像你刚才说的。
如果你真的不想写 byte ,你可以写 (0xfc << 24) >> 24 :

class Main
{
    public static void main(String[] args)
    {
        int a = 0xC838;
        int b = (0xfc << 24) >> 24;
        int result = a + b;
        System.out.printf("%04X\n", result);
    }
}

(the) 24 源于 int (32位)和 byte (8位))。

相关问题