就在我认为我已经很好地掌握了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是一个负数,但事实并非如此,除非我将它转换为一个字节。为什么?对不起,我知道这个问题被问了很多次,而且我自己也问了很多。
1条答案
按热度按时间yyhrrdl81#
0xfc
是正数。如果你想要一个负数,那就写一个负数。-0x4
就行了。但如果您想将其应用于非常量数据,则需要告诉java您希望以某种方式对其进行符号扩展。
问题的核心是您有一个32位有符号整数,但您希望它被视为一个8位有符号整数。最简单的方法就是使用
byte
就像你刚才说的。如果你真的不想写
byte
,你可以写(0xfc << 24) >> 24
:(the)
24
源于int
(32位)和byte
(8位))。