C语言乘法计算溢出

C语言乘法计算溢出,第1张

(1)先做除法在做乘法

(2)扩大定义范围如double

double a,b,c;

c=ab/1000;

ab是超过4294967295的,但是ab/100是绝对不超过4294967295

所以先做除法在做乘法就行了a/100b,你可以定义成double类型

double 和 float 的区别是double精度高,有效数字16位

double a,b,c;c=ab/1000;

C语言的强大之处就在于他的灵活性,程序员自己把握。编译器可以帮助预防错误,但有些程序会利用溢出,所以溢出不完全是错误的事情。

1、溢出:

数据类型超过了计算机字长的界限而出现的数据溢出;

2、溢出可能原因:

当应用程序读取用户数据,复制到应用程序开辟的内存缓冲区中,却无法保证缓冲区的空间足够时

(假设定义数组int

Array[10],

而在调用时使用Array[11]

或存放的数据超过int类型容量等),

内存缓冲区就可能会溢出

3、溢出因素分析:

由于C/C++语言所固有的缺陷,既不检查数组边界,又不检查类型可靠性,且用C/C++语言开发的程序由于目标代码非常接近机器内核,因而能够直接访问内存和寄存器,只要合理编码,C/C++应用程序在执行效率上必然优于其它高级语言。然而,C/C++语言导致内存溢出问题的可能性也要大许多。

//

/ 描述:             /

/  输入一个数,然后计算其阶乘       /

/  阶乘通过数组进行计算,结果位数可调     /

/  N的值为结果的位置,如果越界,可以增大N    /

/               /

/               /

//

#include<stdioh>

#define N 200

void show(int a[]){     //显示结果函数,省略前面的0

 int i = 0,j = 0;

 for(i = 0;i < N;i ++){

  if(a[i] == 0)

   continue;

  for(j = i;j < N;j ++){

   printf("%d|",a[j]);  //以竖线隔开每一位,如果不想这样,可以去掉%d后的竖线

  }

  printf("\n");

  break;

 }

}

void cheng(int a[],int n){   //乘计算函数,结果数组乘以参数n

 int i = 0,j = 0,temp = 0;

 int b[N] = {0};

 for(i = N-1;i+1;i--){

  temp = a[i]  n;

  a[i] = temp % 10 +b[i];

  if(a[i]>= 10){

   b[i-1] = a[i] / 10;

   a[i] = a[i] % 10;

  }

  if(i != 0 && temp != 0){

   b[i-1] += temp/10;

  }

 }

}

int main(){

 int a[N] = {0};

 int i = 0,j = 1,m = 100;

 scanf("%d",&m);     //输入一个整数

 a[N-1] = 1;      //初始化数组,末位为1

 for(i = 1; i <= m; i++)

  cheng(a,i);

 show(a);

 return 0;

}

大哥,你给的分太少了吧。写一个程序可不是回答一个知识性的问题那样简单。程序都是很贵的。引用《疯狂的程序员》上面一句话:程序代码值1块钱,但知道怎么写就是999块。

#include<stdioh>

int j(int x)

{

int i,sum;

sum=1;

for(i=1;i<=x;i++)

sum=i;

return sum ;

}

void main()

{

double r;

int i,n;

char c

r=0;

printf("Please input the n ");

scanf("%d",&n);

for(i=1;i<=n;i++)

r+=1/j(i);

printf("\nThe result is : %f",r);

scanf("\n%c",&c);

}

CPU 执行除法指令 DIV CX、DIV BL,是有可能溢出的。

特别是除数为零时,必然会出现:Divide  overflow。

此外,当被除数的高位,大于等于除数时,也会发生“溢出”。

你问:“如果[rem(H/N)65536 + L]/N的结果,商大于65535,那不是照样溢出?”

你这问题,是不成立的。

“余数 65536 ”中的“余数”,就是高八位,它是小于除数的。

那么“余数 65536 + L”再除以除数,得到的商,就不会大于 65535。

-----------------------

一般来说,在执行 DIV 指令之前,应该加以判断,以避免溢出。

较好的方法是:编写一个“不会溢出”的除法程序。

方法思路如下:

在右图中,

被除数是:1A2B3C4DH,有 32 位数。

除数是:BL,仅有 8 位数。

商,是:32 位数。

按照图中的步骤,只要 BL 不为零,就绝对不会发生溢出。

以上就是关于C语言乘法计算溢出全部的内容,包括:C语言乘法计算溢出、c/c++ 运算溢出问题、C语言中计算100的阶乘,如何保证不会数据溢出。最好是模拟笔算的那种方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10112073.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存