将太大的值转换为 java short
Casting too large a value to java short
我有一个处理音频数据的 java 程序。
我有以下代码,它接受一个介于 -1 和 1 之间的浮点数数组并将其强制转换为 short。我已经意识到,如果提供的值超出 -1 到 1 的范围,则此代码可能会被破坏。
out = (short) ((data[i])*32768);
在下面的代码中,如果 data[i] == 2.0 ,它对于 short 来说太大了。在这种情况下,演员会不会只取前 16 位,无论它们是什么,并将其视为短片?
Java 环绕数据。这意味着如果它达到最大值,它将到达的下一个数字是最小值。 short
在Java中的最大值是32767
。所以如果你有这个片段
short i = 32767;
i++;
那么i
的值就是−32768
,简称为最小值。
(data[i])*32768
将得到可以容纳的最小类型(例如此处为整数)
然后此转换:out = (short) ((data[i])*32768)
将保留 short
的最低有效位(此处为 16 位,包括符号位 - 最高有效位也就是最左边的位)
可以看出,如果MSB为1,则转换为负值,否则为正值。
int i = Short.MAX_VALUE;
short b = (short) i;
System.out.println(i +" -> "+ b);
System.out.println("" + Integer.toBinaryString(0xFFFF & b));
i = Short.MAX_VALUE + 1;
b = (short) i;
System.out.println(i +" -> "+ b);
System.out.println("" + Integer.toBinaryString(0xFFFF & b));
i = Short.MAX_VALUE + Short.MAX_VALUE + Short.MAX_VALUE;
b = (short) i;
System.out.println(i +" -> "+ b);
System.out.println("" + Integer.toBinaryString(0xFFFF & b));
将打印
32767 -> 32767
111111111111111
32768 -> -32768
1000000000000000
98301 -> 32765
111111111111101
看第二个测试,cast value 在 MSB 中有 1
我有一个处理音频数据的 java 程序。
我有以下代码,它接受一个介于 -1 和 1 之间的浮点数数组并将其强制转换为 short。我已经意识到,如果提供的值超出 -1 到 1 的范围,则此代码可能会被破坏。
out = (short) ((data[i])*32768);
在下面的代码中,如果 data[i] == 2.0 ,它对于 short 来说太大了。在这种情况下,演员会不会只取前 16 位,无论它们是什么,并将其视为短片?
Java 环绕数据。这意味着如果它达到最大值,它将到达的下一个数字是最小值。 short
在Java中的最大值是32767
。所以如果你有这个片段
short i = 32767;
i++;
那么i
的值就是−32768
,简称为最小值。
(data[i])*32768
将得到可以容纳的最小类型(例如此处为整数)
然后此转换:out = (short) ((data[i])*32768)
将保留 short
的最低有效位(此处为 16 位,包括符号位 - 最高有效位也就是最左边的位)
可以看出,如果MSB为1,则转换为负值,否则为正值。
int i = Short.MAX_VALUE;
short b = (short) i;
System.out.println(i +" -> "+ b);
System.out.println("" + Integer.toBinaryString(0xFFFF & b));
i = Short.MAX_VALUE + 1;
b = (short) i;
System.out.println(i +" -> "+ b);
System.out.println("" + Integer.toBinaryString(0xFFFF & b));
i = Short.MAX_VALUE + Short.MAX_VALUE + Short.MAX_VALUE;
b = (short) i;
System.out.println(i +" -> "+ b);
System.out.println("" + Integer.toBinaryString(0xFFFF & b));
将打印
32767 -> 32767
111111111111111
32768 -> -32768
1000000000000000
98301 -> 32765
111111111111101
看第二个测试,cast value 在 MSB 中有 1