0

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

どこが間違っているかを見つけてください 解決策を見つけるのを手伝ってください

4

3 に答える 3

3

>> 演算子を Java の >>> 演算子に置き換えると、正しい結果が得られるはずです。これは、C コードが符号なし変数を宣言して右シフトを実行することで実現する、符号なし右シフトを実行します。

他の操作は無害であり、署名されているかどうかに関係なく、同じ結果が得られます。

結果を印刷するには、次のようにする必要があることに注意してください。

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

または、適切な printf フォーマットを使用します (つまり、16 進数で出力します)。

于 2013-09-25T11:55:29.203 に答える
2

1 つの問題は、C コードが符号なし整数型を使用しているのに対し、Java コードは符号付き型を使用していることです (Java には符号なし整数はありません)。

long1 つの可能性は、C の代わりにJava を使用することuint32_tです。署名されていますが、幅が 2 倍になっています。整数のオーバーフローを避けるために、、、v0およびv1en_result0型を変更する必要がある場合もあります。en_result1

于 2013-09-25T11:41:49.100 に答える