将太大的值转换为 java short
Posted
技术标签:
【中文标题】将太大的值转换为 java short【英文标题】:Casting too large a value to java short 【发布时间】:2016-10-19 01:53:44 【问题描述】:我有一个处理音频数据的 java 程序。
我有以下代码,它采用 -1 和 1 之间的浮点数组并转换为短。我已经意识到,如果提供的值超出 -1 到 1 的范围,这段代码可能会被破坏。
out = (short) ((data[i])*32768);
在下面的代码中,如果 data[i] == 2.0 ,它将太大而无法容纳空头。在这种情况下,演员表是否会只取前 16 位,无论它们是什么,并将其视为短片?
【问题讨论】:
【参考方案1】:Java 包装数据。这意味着,如果它达到最大值,它将达到的下一个数字是最小值。 short
在 Java 中的最大值是 32767
。所以如果你有这个sn-p
short i = 32767;
i++;
i
的值将是−32768
,这是简写的最小值。
【讨论】:
我不认为这个答案明确涵盖了给出的例子。如果我这样做(短)9999999 会怎样。(short)9999999 = -27009
。您可以使用模数运算来计算。
所以你的意思是,间接地,演员只是抓住了前 16 位......
那种。它需要 16 个最低有效整数位。
@JohnKugelman 你是对的。我会编辑它。像这样的东西是 UB,但是 C/C++ 中两个非溢出整数之间的操作存在环绕【参考方案2】:
(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
参见第二次测试,强制转换值在 MSB 中为 1
【讨论】:
以上是关于将太大的值转换为 java short的主要内容,如果未能解决你的问题,请参考以下文章