0

有没有办法用数值空间是 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. 我希望能够转换62270208001932053504.

4

1 回答 1

1

编辑:这是我最初答案的翻录和替换

您可以大致执行以下操作:

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

    return bits32 - BitShiftLeft(sign, 32);
}
于 2014-11-05T19:37:37.803 回答