誰かがこの次のステートメントの理由を説明できますか?
short value = (short) 100000000;
System.out.println(value);
私に与える:
-7936
Javaのshortの最大値は32767が正しいことを知っていますか?
あなたの1億ドルの値で、-7936を取得します。 1億から100万に変更した場合にのみ、16960を取得できます。
その理由は、short
の値は-32768〜+32767に制限されており、Javaはshort
(a 縮小プリミティブ変換、JLS 5.1. )効果的にこの操作:100万mod 2 ^ 16(short
の16ビット)は16960です。
あなたがそれをした方法は、同じメモリ位置でより少ない数のビットを単に再解釈するだけです。それらは変更されません。
おそらく、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);
こちら Javaでのプリミティブ変換の絞り込みと拡大を説明する優れた記事。
short s = 696; // 0000 0010 1011 1000 byte x = (byte)s; System.out.println("byte x = " + x);
生成する:
byte x = -72
これで、理由を理解する必要があります。バイトに絞り込むと、JVMが最も重要な部分(00000010)を破棄し、結果(バイナリ形式)が10111000になるためです。これは、以前に調べていたものと同じです。そして、ご覧のとおり、元の値とは異なり、負の値です。