0

long を byte に変換するために、Java で次のプログラムを作成しました。

    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までの数値を許可します。これが222の値に対して-34を取得した理由です。

     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 で署名されているため、222Java に固執するbyteとオーバーフローが発生します (その結果、負の数が表示されます)。Java で整数に 0 ~ 255 の範囲が必要な場合は、少なくともshort.

ただし、その結果を 1 バイトとしてどこかに書き込むだけであれば、そのビット パターン表現222unsigned byte.

于 2012-09-21T05:17:28.303 に答える
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;

あらゆる種類のエンコーディングを発明できます。たとえば、1 バイトで 0 から 2 億または 10 進数の -1.00 から 1.00 などの数百万単位の数値を格納したいとします。1 バイトは 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 に答える
0

java.lang.LongクラスのbyteValue()メソッドを使用できます。

byte b = a.byteValue();

Longタイプオブジェクトを次のように作成する必要があります。

Long a = new Long(222);

また、他の人が指摘しているように、8ビットのバイトで表現できる範囲のオーバーフローにより、これは-34を返します。

于 2012-09-21T05:16:20.100 に答える
-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 = (バイト) num; ステートメントはバイト形式に変換されます。

于 2012-09-21T05:25:52.097 に答える