我遇到了一个奇怪的Java问题,并且已经在Windows和Mac系统上进行了测试,并且始终存在这个问题。
看看这段代码
public static void playA() {
MyObject object = check("cat");
// some stuff...
}
private static MyObject check(String s) throws SQLException {
// some stuff checking string
MyObject o = methodA(s);
// some stuff doing on the object
return o;
}
private static MyObject methodA(String s) throws SQLException {
Connection c = MySettings.getConnection();
PreparedStatement ps = c.prepareStatement("select * from Objects where type = ?");
ps.setString(1, s);
ResultSet resultSet = ps.executeQuery();
while (resultSet.next()) {
// mapping
return object;
}
return null;
}
我希望这段代码生成56,其二进制形式为00111000。但是,它以二进制形式生成值1073741816,1111111111111111111111111111000。我知道java中的int是32位,但是设置byte的类型也是一样的。
但是,如果我声明像这样的二进制文字
int a = -32; //11100000 as per two's complement
System.out.println(a >>> 2);
第一个语句产生值224(预期为-32),而第二个语句产生预期值56
我疯了吗?
答案 0 :(得分:1)
drawBar()
中的位模式不像你说的那样b
,但是11100000
你正在使用一个32位的11111111 11111111 11111111 11100000
- 而不是一个字节 - 并且使用二进制文字并没有改变它。
即使您使用int
而不是byte
,它也无法解决您的问题,因为Java bitshift运算符首先将任何小于32位的类型提升为32位。
因此,移位后得到的位模式为int
。
如果要模拟使用8位值,则需要在应用bitshift之前将32位值位掩码为低8位(您可以使用00111111 11111111 11111111 11111000
而不是{ {1}}现在)
>>