有没有办法用数值空间是 32 位二进制补码整数的严格超集的类型的数字来算术模拟 32 位二进制补码整数溢出?例如,我需要在没有显式类型和类型转换的 WolframAlpha 中执行这样的操作。
我想要的convertTo32BitSignedInt(aValue)
函数的输出必须与我将值转换为支持它的语言(例如 Java: )相同(int)aValue
。
例如,convertTo32BitSignedInt(17643225600
) 的输出需要是463356416
,与我使用以下 cast 相同(int)17643225600
。
目前,我的convertTo32BitSignedInt
函数(在伪代码中)看起来像这样,我很确定这不是更好的解决方案。
if(x > 2147483647 && floor(x / 2147483647 ) == 1){
return (x - 2*2147483648);
}else if(x > 2147483647 && (x % 2147483647 == 0) && (x % 2 == 0)){
return -1 * (x / 2147483647);
}else if(x > 2147483647 && (x % 2147483647 == 0) && (x % 2 > 0)){
return -1 * ((x - 2147483647) / 2147483647) + 2147483647;
}else if(x > 2147483647 && (x % 2147483647 > 0) && (x % 2 == 0)){
return -1 * floor(x / 2147483647) + (x % 2147483647);
}
//...
用例:
我尝试使用阶乘函数的递归实现来演示当 java 程序中存在 32 位有符号整数溢出时会发生的某种行为。
public int factorial(int n) {
return n == 1 || n==0 ? 1 : n * factorial(n - 1);
}
这个int
实现, forfactorial(13)
给出1932053504
, 因为13 * 479001600 > 2147483647
, 32 位有符号整数最大值。
我使用 WolframAlpha 进行演示。WolframAlpha 允许数字 > 2147483647,我想将这些数字模拟为 32 位整数。WolframAlpha 给出了真正的答案是6227020800
. 我希望能够转换6227020800
为1932053504.