有没有办法算术模拟32位二进制补码整数溢出,其数值类型的值空间是32位二进制补码整数的严格超集?我需要在例如WolframAlpha中执行这样的操作,它没有明确的输入和没有类型转换。
我想要的convertTo32BitSignedInt(aValue)
函数的输出必须与我用支持它的语言(例如Java:(int)aValue
)转换值相同。
例如,convertTo32BitSignedInt(17643225600
)的输出必须为463356416
,与我使用以下广播(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);
}
//...
使用案例
我尝试演示当使用factorial函数的递归实现在java程序中存在32位有符号整数溢出时将发生的某种行为。
public int factorial(int n) {
return n == 1 || n==0 ? 1 : n * factorial(n - 1);
}
这个int
实现,factorial(13)
提供1932053504
,因为13 * 479001600 > 2147483647
,32位有符号整数最大值。
我使用WolframAlpha进行演示。 WolframAlpha允许数字> 2147483647我想将这些数字模拟为32位整数。 WolframAlpha给出了真正的答案6227020800
。我希望能够将6227020800
转换为1932053504.
答案 0 :(得分:1)
编辑:这是一个裂缝&取代我的初步答案
你可以大致这样做:
convertTo32BitSignedInt(aValue) {
bits32 = BitAnd(aValue, BitShiftLeft(1, 32) - 1);
sign = BitShiftRight(bits32, 31);
return bits32 - BitShiftLeft(sign, 32);
}