public class CastingTest {
public static void test(int a) {
System.out.println("a = " + a + " (" + getBits(a) + ")");
short b = (short) a;
System.out.println("b = " + b + " (" + getBits(b) + ")");
int c = b;
System.out.println("c = " + c + " (" + getBits(c) + ")");
int d = b & 0xffff;
System.out.println("d = " + d + " (" + getBits(d) + ")");
}
public static String getBits(int v) {
StringBuffer sb = new StringBuffer(32 + 3);
for (int i = 1; i <= 32; i++) {
int mask = 1 << 31;
int bit = (v & mask) == 0 ? 0 : 1;
sb.append(bit);
if (i % 8 == 0 && i != 32)
sb.append(' ');
v <<= 1;
}
return sb.toString();
}
public static String getBits(short v) {
StringBuffer sb = new StringBuffer(16 + 1);
for (int i = 1; i <= 16; i++) {
int mask = 1 << 15;
int bit = (v & mask) == 0 ? 0 : 1;
sb.append(bit);
if (i % 8 == 0 && i != 16)
sb.append(' ');
v <<= 1;
}
return sb.toString();
}
public static void main(String[] args) {
test(65535);
test(65536);
test(-65535);
}
}Output:
a = 65535 (00000000 00000000 11111111 11111111)
b = -1 (11111111 11111111)
c = -1 (11111111 11111111 11111111 11111111)
d = 65535 (00000000 00000000 11111111 11111111)
a = 65536 (00000000 00000001 00000000 00000000)
b = 0 (00000000 00000000)
c = 0 (00000000 00000000 00000000 00000000)
d = 0 (00000000 00000000 00000000 00000000)
a = -65535 (11111111 11111111 00000000 00000001)
b = 1 (00000000 00000001)
c = 1 (00000000 00000000 00000000 00000001)
d = 1 (00000000 00000000 00000000 00000001)
This shows that, when converting int to short, jvm just takes the lower two bytes, even if the number overflows short.
No comments :
Post a Comment