将太大的值转换为 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