web-dev-qa-db-ja.com

Java-IntからShortへの明示的な変換

誰かがこの次のステートメントの理由を説明できますか?

short value = (short) 100000000;
System.out.println(value);

私に与える:

-7936

Javaのshortの最大値は32767が正しいことを知っていますか?

9
Octocat

あなたの1億ドルの値で、-7936を取得します。 1億から100万に変更した場合にのみ、16960を取得できます。

その理由は、shortの値は-32768〜+32767に制限されており、Javaはshort(a 縮小プリミティブ変換、JLS 5.1. )効果的にこの操作:100万mod 2 ^ 16(shortの16ビット)は16960です。

22
rgettman

あなたがそれをした方法は、同じメモリ位置でより少ない数のビットを単に再解釈するだけです。それらは変更されません。

おそらく、max関数とmin関数を使用して、値がshortを超えていることを検出し、それが発生したときにshortの最大値または最小値を割り当てます。

int n = 1000000;
short value = n > Short.MAX_VALUE ? Short.MAX_VALUE : n < Short.MIN_VALUE ? Short.MIN_VALUE : (short)n;

pdate:よりコンパクトに:

import static Java.lang.Math.max;
import static Java.lang.Math.min;

// ...

value = (short)min(max(value, Short.MIN_VALUE), Short.MAX_VALUE);
System.out.println(value);
2
necromancer

こちら Javaでのプリミティブ変換の絞り込みと拡大を説明する優れた記事。

short s = 696; // 0000 0010 1011 1000
byte x = (byte)s;
System.out.println("byte x = " + x);

生成する:

byte x = -72

これで、理由を理解する必要があります。バイトに絞り込むと、JVMが最も重要な部分(00000010)を破棄し、結果(バイナリ形式)が10111000になるためです。これは、以前に調べていたものと同じです。そして、ご覧のとおり、元の値とは異なり、負の値です。

0
tworec