溢出32位变量

时间:2011-06-12 12:44:56

标签: c

目前我正在我的一个应用程序中实现等式(2^A)[X + Y*(2^B)]

问题是32位值溢出,我不能使用64位数据类型。

假设在B = 3Y = 805306367时,它会溢出32位值,但在X = -2147483648时,结果会回到32位范围。
所以我想存储(Y*2^B)的结果。任何人都可以为此建议一些解决方案...... A和B的价值从-1515XY可以有来自2147483647..-2147483648的值。
输出范围为0...4294967295

4 个答案:

答案 0 :(得分:6)

如果数字对于32位变量而言太大,那么您要么使用更多位(通过存储在更大的变量中,或使用多个变量),要么放弃精度并将其存储在浮点数中。由于Y可以是MAX_INT,根据定义,您不能将它乘以大于1的数字,并且仍然适合32位int。

答案 1 :(得分:1)

在这种情况下,我会使用循环而不是乘法。像这样:

int newX = X;
int poweredB = ( 1 << B ); // 2^B
for( int i = 0; i < poweredB ; ++i )
{
    newX += Y; // or change X directly, if you will not need it later.
}
int result = ( 1 << A ) * newX;

但是 注意 :在某些情况下,这只会 - 只有你拥有 保证 ,此结果不会溢出。在你的情况下,当Y是大正数而X是大负数(“大” - 这是太主观)时,这肯定会起作用。但如果X为大正值而Y为大正值,则会再次出现溢出。不仅在这种情况下,还有许多其他人。

答案 2 :(得分:1)

根据作业中A和B的值,我认为预期的解决方案会涉及到:

  • 以下最好是无符号的,所以存储X和Y的符号并按其绝对值操作

  • 将X和Y分别存储在两个变量中,一个保持高16位,另一个保持低位 类似的东西 int hiY = Y&amp; 0xFFFF0000地址;

    int loY = Y&amp; 0x0000FFFF;

  • 向右移动高位部分,使所有变量都具有高位0

  • Y *(2 ^ B)实际上是Y向左移位B位。它相当于将高低部分移位B位,并且由于你移动了高位部分,因此两个操作都适合它们的32位整数

  • 在高低部分中类似地处理X

  • 跟踪X和Y的符号计算高低部分的X + Y *(2 ^ B)

  • 再次将高位和低位结果移位A位

  • 将高低部分加入最终结果

答案 3 :(得分:1)

如果您不能使用64位,因为您的本地C不支持它们而不是其他一些重要原因,您可以在http://gmplib.org/ <考虑 GNU多精度算术库 / p>

相关问题