打印字节时println错误

时间:2013-07-21 18:48:13

标签: java

我已经编写了下面的简单程序以阿拉伯语输出hello:“سلام”但它在控制台上的输出不正确:

import static java.lang.Integer.toBinaryString;

import java.util.Arrays;


public class testOfPrintln {
    public static void main(String []strings){
        String test="salam";
        String test2="سلام";//unicode , arabic
        byte []strbytes=test.getBytes();
        int i=1;
        for(byte bb:strbytes)
            System.out.println(i++  + "    -> " + bb);
        byte []strbytes2=test2.getBytes();
        i=1;
        for(byte bb2:strbytes2){
            System.out.println(i++  + "    ->   " + bb2);
        }
    }

}

并输出:

1    -> 115
2    -> 97
3    -> 108
4    -> 97
5    -> 109
1    -> -40
2    -> -77
3    -> -39
4    -> -124
5    -> -40
6    -> -89
7    -> -39
8    -> -123

为什么在字节之前有一个“ - ”字符?例如:-123 TNX。

2 个答案:

答案 0 :(得分:2)

在Java中byte签名的整数,其值介于-128到127之间。如果您想要 unsigned 值,请转换为int (在ANDing时隐式发生)和AND与255。

System.out.println(i++  + "    -> " + (bb & 0xff));

答案 1 :(得分:1)

Java的设计者使byte类型签名,即使这不是任何人想要99%的时间。因此它的范围是-128到+127而不是0到255.要获得正确的值,它的值为0xFF(二进制,为8位)。 (binary numeric promotion上的Java规则说这个表达式的结果将是int类型,这就是0到255结果适合的原因,而不是被压缩回一个字节并再次变为负数。) :

System.out.println(i++  + "    ->   " + (bb2 & 0xFF));