乘法和除无符号整数

时间:2017-10-18 18:31:16

标签: c time overflow unsigned multiplying

在我的程序中,我必须对无符号整数执行算术运算。

  • 变量a的范围为0到4294967295。
  • 变量b的范围为0到32。

当我通过取a和b的最大值检查边界条件时,我得到0作为答案,因为当我尝试乘以 a MAX_NS 。理想情况下,我应该得到7作为答案。如何编写程序以便溢出得到处理,我得到7作为答案,并希望它适用于a和b.Thanks的其他有效值范围。

#include "stdio.h"

#define MAX_NS 1000000000

 int main()
 {
    unsigned int a =  4294967295;
    unsigned int b =  32 ;

    unsigned int c = ((b * MAX_NS)/a);
    printf("%d",c);


 }

**编辑:**请注意我不能使用无符号long long。我只能使用unsigned int作为变量。

2 个答案:

答案 0 :(得分:2)

这是天气风向标建议的解决方案

#include "stdio.h"

#define MAX_NS 1000000000

int main()
{
    unsigned long long a = 4294967295;
    unsigned long long b = 32;

    unsigned long long c = ((b * MAX_NS) / a);
    printf("%llu", c);
}

答案 1 :(得分:0)

关键是必须使用足够宽的数学计算产品b * MAX_NS

确保*个操作数中至少有一个为unsigned long long

如果b足够大且a足够小,则商需要更宽的类型以避免溢出;

#include "stdio.h"
// #define MAX_NS 1000000000
#define MAX_NS 1000000000LLU

int main(void) {
  unsigned int a =  4294967295;  // type may remain unsigned 
  unsigned int b =  32 ;         // type may remain unsigned 

  unsigned long long c = ((b * MAX_NS)/a);
  printf("%llu",c);
}

或者,乘以1ull轻轻地乘以乘法。通常避免像(unsigned long long) b * MAX_NS中那样进行投射。令人惊讶的匆匆做法有时缩小数学,这可能会在以后uintmax_t b发生。

#define MAX_NS 1000000000

int main(void) {
  unsigned int a =  4294967295;  // type may remain unsigned 
  unsigned int b =  32 ;         // type may remain unsigned 

  unsigned long long c = ((1ull * b * MAX_NS)/a);
  printf("%llu",c);
}