根据OP的评论:不能再复制
我使用NetBeans开发我的Java程序,它们运行良好。 但是当我制作程序的JAR文件时,它为同一输入提供了不同的输出。
我很难调试,我发现在NetBeans中将int
转换为byte
时,结果范围为[-128; 128)
,而JCreator中的相同代码位于{{} 1}}
如何使范围始终为[0; 256)
?
[-128; 128)
答案 0 :(得分:2)
它绝对看起来像一个bug。 byte
的范围是-128到127,而不是0到255。
以下是我认为字节值为-1(即0Xff)的情况,而是打印出255:
public static void main(final String... args)
{
final ByteBuffer buf = ByteBuffer.allocate(4);
// What Java would do on casting...
buf.put((byte) 0xff);
buf.put((byte) 0xff);
buf.put((byte) 0xff);
buf.put((byte) 0xff);
buf.rewind();
System.out.println(buf.getInt()); // -1 -- good
buf.rewind();
// What JCreator seems to do on casting...
buf.put((byte) 0);
buf.put((byte) 0);
buf.put((byte) 0);
buf.put((byte) 0xff);
buf.rewind();
System.out.println(buf.getInt()); // 255 -- WRONG
}
也就是说,当从“字节”转换为“向上转换”时,无论您使用什么Java编译器都不能执行JLS要求它执行的操作,即携带符号位。
我非常怀疑你使用的编译器/运行器也是命令行中的Oracle JDK。
(请注意,PrintStream
有a method to print an int
,但不是byte
;因此该字节被提升为int)
答案 1 :(得分:1)
看来byte []中的值在println中没有正确转换(无论如何,不是你想象的那样,JLS也有)。
您可以使用
System.out.println(Byte.toString(digest[i]));
应显示-128 .. 127