[英]Getting wrong answer after performing mathematical operations
我正在尝试在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
只是没有找到哪里出了问题请帮助我找到解决方案
当用Java的>>>运算符替换>>运算符时,应该得到正确的结果。 它执行无符号右移,这正是C代码通过声明无符号变量并执行右移所实现的功能。
其他操作都是无害的,并且无论签名或未签名,其结果均相同。
请注意,要打印结果,您应该执行以下操作:
println( ((long) result) & 0xFFFFFFFFL ); // where result is int
或使用适当的printf格式(即以十六进制打印)。
一个问题是C代码使用无符号整数类型,而Java代码使用有符号类型(Java中没有无符号整数)。
一种可能性是使用Java的long
代替C的uint32_t
。 它已签名,但宽度是原来的两倍。 您可能还需要更改v0
, v1
, en_result0
和en_result1
的类型,以避免整数溢出。
这是因为java中整数的值范围。
int数据类型是32位带符号的二进制补码整数。 最小值> -2,147,483,648,最大值为2,147,483,647(含)
使用long
而不是int
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.