将int转换为byte会在Netbeans和JCreator中产生不同的结果

时间:2014-12-26 15:56:07

标签: java jar casting int byte

根据OP的评论:不能再复制

我使用NetBeans开发我的Java程序,它们运行良好。 但是当我制作程序的JAR文件时,它为同一输入提供了不同的输出。

我很难调试,我发现在NetBeans中将int转换为byte时,结果范围为[-128; 128),而JCreator中的相同代码位于{{} 1}}

如何使范围始终为[0; 256)

[-128; 128)

2 个答案:

答案 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。

(请注意,PrintStreama method to print an int,但不是byte;因此该字节被提升为int)

答案 1 :(得分:1)

看来byte []中的值在println中没有正确转换(无论如何,不​​是你想象的那样,JLS也有)。

您可以使用

 System.out.println(Byte.toString(digest[i]));

应显示-128 .. 127