将太大的值转换为 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的主要内容,如果未能解决你的问题,请参考以下文章

在java中switch存放String参数

可以将boolean类型的数值转换为其他基本数据类型吗

Java数据类型转换

java中类型转化及例题

如何在Java中将非常大的十进制数转换为二进制数

当我为给定的 dtype 设置太大的值时会发生啥?