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

时间:2013-09-25 11:37:49

标签: 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,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;
 } 

en_result0和en_result1是全局变量,与v0和v1的类型相同

类似地,Java代码段看起来像这样。

public static void encipher(int iterations, int v0, int v1)
 {
     int i;
int key[]={0x02a4bd14,0x6c753bde,0x4ac819ad,0x6da4a0c4};
     int 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;

}

此处en_result0和en_result1也是int

类型的全局变量
The answer in "C" programme en_result0=3755627302 and en_result1=3278396279 

The Answer in "java" Programme en_result0=-1152914223 and en_result1=1706153302

请勿找出出错的地方请帮我找到解决方案

3 个答案:

答案 0 :(得分:3)

更换&gt;&gt;后,您应该会得到正确的结果Java的运算符&gt;&gt;&gt;运营商。它执行无符号右移,正如C代码通过声明无符号变量和正确移位所实现的那样。

无论是签名还是未签名,其他操作都是无害的,并给出相同的结果。

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

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

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

答案 1 :(得分:2)

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

一种可能性是使用Java long代替C uint32_t。它是签名但宽度加倍。您可能还需要更改v0v1en_result0en_result1的类型,以避免整数溢出。

答案 2 :(得分:0)

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

  

int数据类型是32位带符号的二进制补码整数。它的最小值> -2,147,483,648,最大值2,147,483,647(含)

使用long代替int