代码拉取完成,页面将自动刷新
Using the following code to test unsigned right shift '>>>' operation for byte and short type variables, the output result is not expected:
1 public class Main {
2 public static void main(String[] args) {
3 byte b = -4;
4 short s = -4;
5 System.out.println("b=" + b + ", s=" + s);
6 System.out.println("b=0x" + Integer.toHexString((int)b)
7 + ", s=0x" + Integer.toHexString((int)s));
8 b >>>= 4;
9 s >>>= 4;
10 System.out.println("b=" + b + ", s=" + s);
11 System.out.println("b=0x" + Integer.toHexString((int)b)
12 + ", s=0x" + Integer.toHexString((int)s));
13 }
14 }
The correct result should be:
b=-4, s=-4
b=0xfffffffc, s=0xfffffffc
b=-1, s=-1
b=0xffffffff, s=0xffffffff
But the output of the test code is:
b=-4, s=-4
b=0xfffffffc, s=0xfffffffc
b=268435455, s=268435455
b=0xfffffff, s=0xfffffff
The value 0xfffffff generated by the compiler is not correct. See Main.VtableImpl.mpl:
#LINE Main.java : 10, INSTIDX : 90||005a: getstatic
regassign ptr %23 (regread ref %60)
LOC 1 10
regassign ref %60 (iread ref <* <* <$Ljava_2Fio_2FPrintStream_3B>>> 0 (regread ptr %64))
dassign %Reg0_R862 0 (regread ref %60)
intrinsiccall MCCIncDecRef (regread ref %60, regread ptr %23)
#LINE Main.java : 10, INSTIDX : 93||005d: new
regassign ptr %24 (regread ref %61)
regassign ref %61 (gcmalloc ref <$Ljava_2Flang_2FStringBuilder_3B>)
dassign %Reg1_R1169 0 (regread ref %61)
intrinsiccall MCCDecRef (regread ptr %24)
#LINE Main.java : 10, INSTIDX : 97||0061: invokespecial
icallassigned (regread ptr %65, regread ref %61) {}
#LINE Main.java : 10, INSTIDX : 100||0064: ldc
callassigned &MCC_GetOrInsertLiteral (regread ptr %66) { regassign ptr %55}
#LINE Main.java : 10, INSTIDX : 102||0066: invokevirtual
icallassigned (regread ptr %67, regread ref %61, regread ptr %55) { regassign ptr %25}
regassign ptr %26 (regread ref %61)
regassign ref %61 (regread ptr %25)
dassign %Reg1_R1169 0 (regread ref %61)
intrinsiccall MCCDecRef (regread ptr %26)
#LINE Main.java : 10, INSTIDX : 105||0069: iload_1
#LINE Main.java : 10, INSTIDX : 106||006a: invokevirtual
assertnonnull (regread ref %61)
icallassigned (regread ptr %68, regread ref %61, constval i32 0xfffffff) { regassign ptr %27}
regassign ptr %28 (regread ref %61)
regassign ref %61 (regread ptr %27)
dassign %Reg1_R1169 0 (regread ref %61)
intrinsiccall MCCDecRef (regread ptr %28)
#LINE Main.java : 10, INSTIDX : 109||006d: ldc
callassigned &MCC_GetOrInsertLiteral (regread ptr %69) { regassign ptr %56}
#LINE Main.java : 10, INSTIDX : 111||006f: invokevirtual
assertnonnull (regread ref %61)
icallassigned (regread ptr %67, regread ref %61, regread ptr %56) { regassign ptr %29}
regassign ptr %30 (regread ref %61)
regassign ref %61 (regread ptr %29)
dassign %Reg1_R1169 0 (regread ref %61)
intrinsiccall MCCDecRef (regread ptr %30)
#LINE Main.java : 10, INSTIDX : 114||0072: iload_2
#LINE Main.java : 10, INSTIDX : 115||0073: invokevirtual
assertnonnull (regread ref %61)
icallassigned (regread ptr %68, regread ref %61, constval i32 0xfffffff) { regassign ptr %31}
regassign ptr %32 (regread ref %61)
regassign ref %61 (regread ptr %31)
dassign %Reg1_R1169 0 (regread ref %61)
intrinsiccall MCCDecRef (regread ptr %32)
#LINE Main.java : 10, INSTIDX : 118||0076: invokevirtual
assertnonnull (regread ref %61)
icallassigned (regread ptr %70, regread ref %61) { regassign ptr %33}
regassign ptr %34 (regread ref %62)
regassign ref %62 (regread ptr %33)
dassign %Reg1_R50 0 (regread ref %62)
intrinsiccall MCCDecRef (regread ptr %34)