Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java错误:可能会丢失精度_Java_Byte_Bytearray - Fatal编程技术网

Java错误:可能会丢失精度

Java错误:可能会丢失精度,java,byte,bytearray,Java,Byte,Bytearray,我正在制作一个小型Java程序,可以加密任何类型的文件。我这样做的方式如下:打开输入文件,在与该文件大小相同的字节数组中读取它,然后进行编码,然后将整个数组写入名为output.dat的.dat文件。为了索引字节数组,我使用int类型的变量。代码: for(int i : arr) { if(i>0) { arr[i] = arr[i-1]^arr[i]; } } “arr”是

我正在制作一个小型Java程序,可以加密任何类型的文件。我这样做的方式如下:打开输入文件,在与该文件大小相同的字节数组中读取它,然后进行编码,然后将整个数组写入名为output.dat的.dat文件。为了索引字节数组,我使用int类型的变量。代码:

        for(int i : arr) {
            if(i>0) {
                arr[i] = arr[i-1]^arr[i];
            }
        }
“arr”是与输入文件大小相同的字节数组

我得到的错误是:CodingEvent.java:42:error:可能会丢失精度

arr[i]=arr[i-1]^arr[i]

(一个箭头指向^operator)

必需:字节

找到:int


怎么了?你能帮我个忙吗?

字节^字节的结果,与直觉相反,
int
。将表达式赋值回
arr[i]
时,对表达式的结果使用强制转换:

arr[i] = (byte)(arr[i-1]^arr[i]);
这是因为运算符被定义为对其操作数执行a操作,因此它真正执行的操作(在本例中)是:


…这自然会导致
int
。这就是我们需要回溯的原因。

运算符的操作数是第一位的(称为二进制数字提升)。因此
byte
s(
arr[i-1]
arr[i]
)都被转换为
int
,操作的结果也是
int


您需要将结果转换回
字节
以将其分配给
arr[i]

如果arr[]是byte[]类型,那么这就是问题所在,当java对整数执行任何二进制操作时,它会根据运算符返回一个intlong。在这种情况下,arr[i-1]^arr[i]的结果是一个int,您试图将其存储在字节中

当运算符&、^或|的两个操作数都是可转换(§5.1.8)为基元整数类型的类型时,首先对操作数(§5.6.2)执行二进制数字提升

1.如果任何操作数为引用类型,则应进行解装箱转换(§5.1.8)

2.加宽原语转换(§5.1.2)用于转换以下规则指定的一个或两个操作数:

  • 如果其中一个操作数的类型为double,则另一个操作数将转换为double

  • 否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float

  • 否则,如果其中一个操作数的类型为long,则另一个操作数将转换为long

  • 否则,两个操作数都转换为int类型。

  • 因此,下面的表达式首先转换为
    int

    arr[i-1]^arr[i];
    
    要将其转换回
    字节
    ,请使用显式转换:

    arr[i] = (byte)(arr[i-1]^arr[i]);
    

    英雄联盟我们都提到二进制数字转换。那太怪了。
    arr[i] = (byte)(arr[i-1]^arr[i]);