打印字节时出现println错误

3

我编写了以下简单程序,用于输出阿拉伯语的“سلام”(意为“你好”),但控制台的输出结果不正确:

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。谢谢。
2个回答

2
在Java中,byte是一个带符号的整数,其值范围从-128到127。如果您想要无符号的值,请将其转换为int(当进行AND运算时会隐式发生),并与255进行AND运算。
System.out.println(i++  + "    -> " + (bb & 0xff));

1
加上128是错误的。虽然结果将在0到255范围内,但所有数字都将有不同的表示方式,并且((byte)(bb + 128)) != bb。正确的方法是使用“与”运算。 - Boann

1
Java的设计者将byte类型设置为有符号,即使99%的情况下都不是这样。因此,它的范围是-128到+127,而不是0到255。要获取正确的值,请使用0xFF进行按位与操作(在二进制中,它是八个1位)。 (Java关于二进制数字提升的规则指出,此表达式的结果将是int类型,因此0到255的结果适合,而不会被压缩回字节并再次变为负数。):
System.out.println(i++  + "    ->   " + (bb2 & 0xFF));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接