0

我用 Java 编写了以下程序来将 long 转换为字节。

    public class LongtoByte 
    {
            public static void main(String[] args)
            {
                long a=222;
                byte b=(byte)(a & 0xff);
                System.out.println("the value of b is" +b);

            }
    }

问题是我得到变量 b 的结果 -34。

请告诉我如何获得正确的值。我只想要以字节为单位的值。

4

5 回答 5

2

Java 的类型是有符号的,字节允许 -128 和 +127 之间的数字。这就是你得到 -34 的 222 值的原因

     long a=121;
     byte b=(byte)(a );
     System.out.println("the value of b is" +b);
于 2012-09-21T05:22:02.270 回答
1

所有整数类型(包括byte)都在 Java 中签名,所以如果你坚持222使用 Java byte,你会得到一个溢出(导致你看到的负数)。如果您在 Java 中需要 0–255 范围内的整数,您至少需要一个short.

但是,如果您只是要将结果作为单个字节写入某处,则无需担心,因为它的位模式表示222unsigned byte.

于 2012-09-21T05:17:28.303 回答
0

您可以使用java.lang.Long类的byteValue()方法:

byte b = a.byteValue();

您将不得不Long像这样创建一个类型对象:

Long a = new Long(222);

正如其他人所指出的那样,由于可以由 8 位字节表示的范围溢出,这将返回 -34。

于 2012-09-21T05:16:20.100 回答
0

当您打印一个字节时,它假定范围为 -128 到 127。

如果你打印

byte b = (byte) 222;

你应该期望得到一个负数。

如果要存储 0 到 255 的范围,则需要在获取值时对其进行转换。

int i = 222;
byte[] b = { (byte) i };
int i2 = b[0] & 0xFF; // give me the original unsigned 0 to 255.
assert i == i2;

您可以发明各种编码。例如,假设您要存储仅以百万为单位的数字,例如 0 到 2 亿或十进制数字 -1.00 到 1.00 一个字节。您可能首先认为这是不可能的,因为一个字节只存储 8 位。

// store millions.
byte b = (byte) (i / 1000000);
int i = (b & 0xff) * 1000000;

// store decimal from -1.00 to 1.00
byte b = (byte) Math.round(d * 100);
double d = b / 100.0;
于 2012-09-21T07:11:13.077 回答
-1
public class LongtoByte 
    {
            public static void main(String[] args)
            {
                long a=222;
                byte b=(byte)(a);
                System.out.println("the value of b is" +b);

            }
    }

这个字节 bValue = (byte) num; 语句被转换为字节格式。

于 2012-09-21T05:25:52.097 回答