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
#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位数学”这样的不寻常要求应该出现在原始帖子中。