Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无符号整数的乘法和除法_C_Time_Overflow_Unsigned_Multiplication - Fatal编程技术网

C 无符号整数的乘法和除法

C 无符号整数的乘法和除法,c,time,overflow,unsigned,multiplication,C,Time,Overflow,Unsigned,Multiplication,在我的程序中,我必须对无符号整数执行算术运算 变量a的范围为0到4294967295 变量b的范围为0到32 当我通过取a和b的最大值来检查边界条件时,我得到的答案是0,因为当我尝试将a和MAX_NS相乘时会发生溢出。理想情况下,我应该得到7作为答案。我如何编写程序,以确保溢出得到处理,我得到7作为答案,并希望它适用于a和b的其他有效值范围。谢谢 #include "stdio.h" #define MAX_NS 1000000000 int main() { unsigne

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

  • 变量a的范围为0到4294967295
  • 变量b的范围为0到32
当我通过取a和b的最大值来检查边界条件时,我得到的答案是0,因为当我尝试将aMAX_NS相乘时会发生溢出。理想情况下,我应该得到7作为答案。我如何编写程序,以确保溢出得到处理,我得到7作为答案,并希望它适用于a和b的其他有效值范围。谢谢

#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。我只能对变量使用无符号int。

这里是Weather Vane建议的解决方案

#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);
}

关键是必须使用足够宽的数学计算乘积
b*MAX\NS

确保至少有一个
*
操作数是
无符号长的

对于足够大的
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);
}
或者,通过乘以
1all
轻轻地引导乘法运算。通常避免在
(unsigned long-long)b*MAX\n
中进行强制转换。令人惊讶的是,疯狂的施法练习有时会缩小数学范围,这可能在以后的某个日期发生在这里,使用
uintmax\u 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);
}

使用
无符号long-long
?您将除以最大无符号值,因此
无符号int
范围内的所有结果(除一个外)将为
0
。如果使用任意大小的中间值执行计算,则无法单独使用运算顺序来获得相同的结果。可能您可以使用一些特定于输入值的技巧(最简单的:
c=7;
),但除此之外,最好是显式升级到更广泛的类型,例如
uintmax\t
。我不明白为什么您希望答案是7。全精度答案将使五个低阶位全部为零,高于该值的32位全部为一。如何从中得到7?”……对无符号整数执行算术运算……
a
的范围为0到4294967295”。嗯,当然对于除法,它是“`1到4294967295”。
#定义最大值100000000
-->
#定义最大值100000000整
,但即使我使用较小的“a”值(假设50000000),我也没有得到正确的答案。应该是640,但我得到38。原因是什么?一定是其他问题。我已经检查了这个代码,它打印了7。@GopalaKrishna在你的例子中
b*MAX_NS
32000000
,它太大了,无法存储在32位
无符号整数中,不管你用什么除以。你想显示你的打印屏幕吗?正如我告诉你的,问题出在其他方面,而不是代码。我更改了主程序:unsigned int a=50000000;无符号整数b=32;无符号整数c=(b*最大值)/a);printf(“%d”,c);。我的答案是38谢谢你的回答,但是我们的硬件只支持32位,不能使用无符号long-long。@GopalaKrishna即使是8位处理器也可以支持
无符号long-long
。兼容的C编译器将形成实现64位类型和数学的必要指令。像“仅使用32位数学”这样的不寻常要求应该出现在原始帖子中。