Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.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 - Fatal编程技术网

Java 执行数学运算后得到错误答案

Java 执行数学运算后得到错误答案,java,Java,我试图用java执行一些数学计算,但没有得到预期的结果。由于相同的代码片段,当我在“C”程序中运行时,那么它工作正常,请指导我代码中的错误 传递给函数的值为 v0=1970012 and v1=1970012 and iterations= 32 “C”程序片段看起来像这样 void encipher(uint8_t iterations, uint32_t v0, uint32_t v1) { uint8_t i; int key[]={0x02a4bd14,0x6c7

我试图用java执行一些数学计算,但没有得到预期的结果。由于相同的代码片段,当我在“C”程序中运行时,那么它工作正常,请指导我代码中的错误

传递给函数的值为

v0=1970012 and v1=1970012 and iterations= 32 
“C”程序片段看起来像这样

void encipher(uint8_t iterations, uint32_t v0, uint32_t v1)
{
    uint8_t i;

     int key[]={0x02a4bd14,0x6c753bde,0x4ac819ad,0x6da4a0c4};




     uint32_t sum, delta;

      sum=0x32d61b8e;
       delta=0x9E3779B9;
      for (i=0; i < iterations; i++) {
      v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
      sum += delta;
       v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
   }
      en_result0=v0; en_result1=v1;
 } 


只是没有发现哪里出错请帮助我找到解决方案一个问题是C代码使用无符号整数类型,而Java代码使用有符号类型(Java中没有无符号整数)


一种可能性是使用Java的
long
代替C的
uint32\u t
。它是有符号的,但宽度是它的两倍。您可能还需要更改
v0
v1
en_result0
en_result1
的类型,以避免整数溢出。

一个问题是C代码使用无符号整数类型,而Java代码使用有符号类型(Java中没有无符号整数)


一种可能性是使用Java的
long
代替C的
uint32\u t
。它是有符号的,但宽度是它的两倍。您可能还需要更改
v0
v1
en_result0
en_result1
的类型,以避免整数溢出。

这是因为java中整数的值范围

int数据类型是一个32位带符号2的补码整数。其最小值为>-2147483648,最大值为2147483647(含)


使用
long
而不是
int

这是因为java中整数的值范围

int数据类型是一个32位带符号2的补码整数。其最小值为>-2147483648,最大值为2147483647(含)


使用
long
而不是
int

当您用Java的>>>操作符替换>>操作符时,应该会得到正确的结果。它执行无符号右移,这正是C代码通过声明无符号变量和执行右移所实现的

其他操作是无害的,并且给出相同的结果,无论是有符号的还是无符号的

请注意,要打印结果,应执行以下操作:

println( ((long) result) & 0xFFFFFFFFL ); // where result is int

或者使用适当的printf格式(即以十六进制打印)。

用Java的>>>运算符替换>>运算符时,应该会得到正确的结果。它执行无符号右移,这正是C代码通过声明无符号变量和执行右移所实现的

其他操作是无害的,并且给出相同的结果,无论是有符号的还是无符号的

请注意,要打印结果,应执行以下操作:

println( ((long) result) & 0xFFFFFFFFL ); // where result is int

或者使用适当的printf格式(即以十六进制打印)。

好吧,有一件事需要记住,Java没有无符号变量。这会影响某些事情(尤其是值的显示)。请注意,Java中的
int
是有符号的-没有与C的insigned int类型完全对应的类型。我只是对这个有符号和无符号的问题感到困惑。他们说,无符号int(即,只有正值)可以存储比有符号int更大的值(可以是正/负)。有一件事你需要记住,Java没有无符号变量。这会影响一些事情(特别是值的显示).请注意Java中的
int
是有符号的-没有与C的insigned int类型完全对应的类型我只是对这个有符号和无符号问题感到困惑。他们说,无符号int(即,只有正数)可以比有符号int(可以是正数/负数)存储更大的值。虽然这些带有额外大小的位移位也可能会得到不同的答案,但它可能只适用于
&0xFFFFFFFF
结尾处。我尝试过使用“long”还是没有得到正确的答案?你是说对结果满意吗values@Dukeling:我决定收回第二个建议,因为在我的回答中有许多小细节我没有精力去解决。虽然这些随着额外大小的位移动也可能会得到不同的答案,但它可能只适用于
&0xfffffffff
最后我用了“long”这个词还是没有得到正确的答案?你是说对结果满意吗values@Dukeling当前位置我决定收回第二个建议,因为在我的回答中有很多小细节我没有精力去解决。我实际上试过用long也没有得到答案我实际上试过用long也没有得到答案他回答
The Answer in "java" Programme en_result0=-1152914223 and en_result1=1706153302
println( ((long) result) & 0xFFFFFFFFL ); // where result is int