1

以下のコードを実行してみました:

public class Test5 {

/**
 * @param args
 */
public static void main(String[] args) {
    short x = 0;
    int i = 123456;


    x = (short) (x + i);
    System.out.println(x);
}

}

出力「-7616」はどうですか?タイプをshortにキャストすると、integerとshortはどのように機能しますか?

4

8 に答える 8

3

長いバージョン: http ://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html

ショートバージョン:Javaはintの最下位16ビットを取得し、同じ順序でショートに入れます。

于 2012-12-30T08:21:30.330 に答える
1

short2バイト整数です。また、JavaタイプはCのように「符号なし」にすることはできません。したがって、最大値は32767です。(Short.MAX_VALUE)。

ご覧のとおり、この変数に大きな値を設定しようとしました。

123456
 32767

このような値のバイナリ表現は、投稿した負の値です。ところで、同じことがCでも起こります。

于 2012-12-30T08:18:45.907 に答える
1

intとshortを追加すると、結果はint、つまり4バイトになります。

しかし、それをshortにキャストすると、intの最後の2バイトからshortになります。

123456のバイトは0x0 0x1 0xe2 0x40であるため、から短くしてい0xe2 0x40ます。

1である最初のビットは0xe2、結果のショートが負になります。

この短いプログラムで遊んで、何が起こるかを確認できます。

int i = 123456; // <== change the value
System.out.format("Bytes of %d: ", i);
byte[] bytes = ByteBuffer.allocate(4).putInt(i).array();
for (byte b : bytes) {
   System.out.format("0x%x ", b);
}
System.out.format("\nlast two bytes : %d*256 + %d = %d\n", bytes[2], bytes[3], (short)(bytes[2]*256 + bytes[3]));

出力:

Bytes of 123456: 0x0 0x1 0xe2 0x40 
Last two bytes : -30*256 + 64 = -7616
于 2012-12-30T08:22:13.533 に答える
1

これは、プリミティブ変換のナローイングと呼ばれるものです。に変換しようとしintていshortます。

技術的すぎるかもしれませんが、Java言語仕様のセクション5.1.3を理解してみてください。

于 2012-12-30T08:22:53.353 に答える
0

データ型の最大値shortは32,767です。ここでは、123456に0を追加しました。123456はの最大値よりも大きいshortため、切り捨てられます。

于 2012-12-30T08:15:28.317 に答える
0

明示的なキャスト。Java intをshortにキャストすると、サイレント切り捨てが発生します。

于 2012-12-30T08:22:03.267 に答える
0

のタイプはx + iですint。このintには、shortの最大値よりも大きい値が含まれています。これをshortにキャストすると、32ビットintの最後の16ビットがshortと見なされ、これらの最後の16ビットはたまたま負のshort値を表します。

Java言語仕様によると:

符号付き整数から整数型Tへのナロー変換では、n個の最下位ビットを除くすべてが単純に破棄されます。nは型Tを表すために使用されるビット数です。数値の大きさに関する情報が失われる可能性があります。 、これにより、結果の値の符号が入力値の符号と異なる場合があります。

于 2012-12-30T08:22:12.030 に答える
0

または、このコードを見て実行します。例を挙げて理解する方が簡単なはずです。

public class Test {
    public static void main(String args[]) throws Exception {
        short v = 32767;
        System.out.println(v);
        v += 1;
        System.out.println(v);
        v += 1;
        System.out.println(v);

        System.out.println();

        v = 0;
        for (int i = 0; i < 123; i++) {
            int intVal = i * 1000;
            v = (short) intVal;
            System.out.println("intVal[" + intVal + "] shortVal[" + v + "]");
        }
    }
}

出力...

32767
-32768
-32767

intVal[0] shortVal[0]
intVal[1000] shortVal[1000]
intVal[2000] shortVal[2000]
intVal[3000] shortVal[3000]
intVal[4000] shortVal[4000]
intVal[5000] shortVal[5000]
intVal[6000] shortVal[6000]
intVal[7000] shortVal[7000]
intVal[8000] shortVal[8000]
intVal[9000] shortVal[9000]
intVal[10000] shortVal[10000]
intVal[11000] shortVal[11000]
intVal[12000] shortVal[12000]
intVal[13000] shortVal[13000]
intVal[14000] shortVal[14000]
intVal[15000] shortVal[15000]
intVal[16000] shortVal[16000]
intVal[17000] shortVal[17000]
intVal[18000] shortVal[18000]
intVal[19000] shortVal[19000]
intVal[20000] shortVal[20000]
intVal[21000] shortVal[21000]
intVal[22000] shortVal[22000]
intVal[23000] shortVal[23000]
intVal[24000] shortVal[24000]
intVal[25000] shortVal[25000]
intVal[26000] shortVal[26000]
intVal[27000] shortVal[27000]
intVal[28000] shortVal[28000]
intVal[29000] shortVal[29000]
intVal[30000] shortVal[30000]
intVal[31000] shortVal[31000]
intVal[32000] shortVal[32000]
intVal[33000] shortVal[-32536]
intVal[34000] shortVal[-31536]
intVal[35000] shortVal[-30536]
intVal[36000] shortVal[-29536]
intVal[37000] shortVal[-28536]
intVal[38000] shortVal[-27536]
intVal[39000] shortVal[-26536]
intVal[40000] shortVal[-25536]
intVal[41000] shortVal[-24536]
intVal[42000] shortVal[-23536]
intVal[43000] shortVal[-22536]
intVal[44000] shortVal[-21536]
intVal[45000] shortVal[-20536]
intVal[46000] shortVal[-19536]
intVal[47000] shortVal[-18536]
intVal[48000] shortVal[-17536]
intVal[49000] shortVal[-16536]
intVal[50000] shortVal[-15536]
intVal[51000] shortVal[-14536]
intVal[52000] shortVal[-13536]
intVal[53000] shortVal[-12536]
intVal[54000] shortVal[-11536]
intVal[55000] shortVal[-10536]
intVal[56000] shortVal[-9536]
intVal[57000] shortVal[-8536]
intVal[58000] shortVal[-7536]
intVal[59000] shortVal[-6536]
intVal[60000] shortVal[-5536]
intVal[61000] shortVal[-4536]
intVal[62000] shortVal[-3536]
intVal[63000] shortVal[-2536]
intVal[64000] shortVal[-1536]
intVal[65000] shortVal[-536]
intVal[66000] shortVal[464]
intVal[67000] shortVal[1464]
intVal[68000] shortVal[2464]
intVal[69000] shortVal[3464]
intVal[70000] shortVal[4464]
intVal[71000] shortVal[5464]
intVal[72000] shortVal[6464]
intVal[73000] shortVal[7464]
intVal[74000] shortVal[8464]
intVal[75000] shortVal[9464]
intVal[76000] shortVal[10464]
intVal[77000] shortVal[11464]
intVal[78000] shortVal[12464]
intVal[79000] shortVal[13464]
intVal[80000] shortVal[14464]
intVal[81000] shortVal[15464]
intVal[82000] shortVal[16464]
intVal[83000] shortVal[17464]
intVal[84000] shortVal[18464]
intVal[85000] shortVal[19464]
intVal[86000] shortVal[20464]
intVal[87000] shortVal[21464]
intVal[88000] shortVal[22464]
intVal[89000] shortVal[23464]
intVal[90000] shortVal[24464]
intVal[91000] shortVal[25464]
intVal[92000] shortVal[26464]
intVal[93000] shortVal[27464]
intVal[94000] shortVal[28464]
intVal[95000] shortVal[29464]
intVal[96000] shortVal[30464]
intVal[97000] shortVal[31464]
intVal[98000] shortVal[32464]
intVal[99000] shortVal[-32072]
intVal[100000] shortVal[-31072]
intVal[101000] shortVal[-30072]
intVal[102000] shortVal[-29072]
intVal[103000] shortVal[-28072]
intVal[104000] shortVal[-27072]
intVal[105000] shortVal[-26072]
intVal[106000] shortVal[-25072]
intVal[107000] shortVal[-24072]
intVal[108000] shortVal[-23072]
intVal[109000] shortVal[-22072]
intVal[110000] shortVal[-21072]
intVal[111000] shortVal[-20072]
intVal[112000] shortVal[-19072]
intVal[113000] shortVal[-18072]
intVal[114000] shortVal[-17072]
intVal[115000] shortVal[-16072]
intVal[116000] shortVal[-15072]
intVal[117000] shortVal[-14072]
intVal[118000] shortVal[-13072]
intVal[119000] shortVal[-12072]
intVal[120000] shortVal[-11072]
intVal[121000] shortVal[-10072]
intVal[122000] shortVal[-9072]
于 2012-12-30T08:24:11.567 に答える