算术模拟32位整数溢出

时间:2014-11-05 19:05:16

标签: type-conversion wolframalpha

有没有办法算术模拟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.

1 个答案:

答案 0 :(得分:1)

编辑:这是一个裂缝&取代我的初步答案

你可以大致这样做:

convertTo32BitSignedInt(aValue) {
    bits32 = BitAnd(aValue, BitShiftLeft(1, 32) - 1);
    sign = BitShiftRight(bits32, 31);

    return bits32 - BitShiftLeft(sign, 32);
}