當前位置:首頁 » 編程語言 » c語言判斷溢出

c語言判斷溢出

發布時間: 2022-07-12 05:10:08

㈠ 在c語言中怎樣判斷一個程序運算結果是否溢出,舉個例子,你用C語言編寫程序求n!,判斷n為幾時n!溢出

#include<stdio.h>

unsignedf(unsigned*n){

unsignedi=2,res=1,lres=1;

while(1){

lres*=i;

if(lres<res){

*n=i-1;

returnres;//溢出後,階乘的結果會變小。

}

res=lres;

i++;

}

returni;//本行是不會執行的,這是為了函數需要返回值而設的。

}

intmain(){

unsignedn;

printf("%u!=%u ",n,f(&n));

return0;

}

㈡ C語言中怎麼樣判斷溢出

判斷邊界:void outstr(int a[10])
{ for(i=0;a[i]!=0&&i<10;i++) {
printf("%d\n",a[i]);
}}當i=10時,判斷i<10同時需要判斷a[i]!=0,此時a[10]已經訪問到非法區域,可能引起緩沖區溢出問題。防止方法:將判斷條件分成幾條語句例:if(i<10){ if(a[i]!=0) {
... }}
</SPAN>

㈢ C語言溢出問題。

以C中同一類型運算,結果仍然是這個類型,由於a與1都是int,所以A+1結果仍然是int,此時就發生了溢出,賦值到B中也是溢出後的值。而當一個int與一個long運算時,結果的類型是long,1L後面的L就是long類型的意思,所以a+1L是int與long運算,得到的也是long,然後賦值到b,所以是正確結果

㈣ C語言中怎麼處理溢出

C
中調用積運算符之後做溢出檢測已經太晚,但調用和運算符之後做檢測則一點也不遲,
所以你可以通過對和運算結果的檢測實現能檢測溢出的積運算,因為
a
*
b
既是
a

b
的和:
-5000000
*
1374389539
等於
-(5000000
*
1374389539)。括弧里是
5000000

1374389539
的和。
我把能檢測溢出的和運算包在
add(
)
里,然後在
multiply(
)
里重復調用
add(
)。
add(
)
怎麼檢測溢出?
和運算的結果若溢出將導致數值的環繞。上溢導致往下環繞,下溢導致往上環繞。
邊界狀況:
(1)最輕微的上溢是
INT_MAX
+
1
:結果是
INT_MIN。
(2)最嚴重的上溢是
INT_MAX
+
INT_MAX
:結果是
-2。
(3)最輕微的下溢是
INT_MIN
-
1
:結果是
INT_MAX。
(4)最嚴重的下溢是
INT_MIN
-
INT_MIN
:結果是
0。
結論:
(1)所有上溢結果都小於任何一個操作數。
(2)所有下溢結果都大於任何一個操作數。
所以
add(
)
可以用結果和任意選定的一個參數判斷溢出,並以落選的參數判斷溢出的方向。
add(
)
無法以返回值舉報溢出,所以採用
strtol(
)
的舉報方法。
不同於
strtol(
)
的是,若沒有溢出,add(
)
會把
0
賦值給
errno。
multiply(
)
在這方面跟
add(
)
一樣。

#include<stdio.h>
#include<errno.h>
/*
errno,
ERANGE
*/

/*
*
Returns
the
sum
of
a
and
b,
with
overflow
and
underflow
check.
*
If
overflow
or
underflow
occurred,
sets
errno
to
ERANGE,
else
to
0.
*/
int
add(
int
a,
int
b
)
{
int
result
=
a
+
b;
if(
b
>
0
&&
result
>
a
||
b
<=
0
&&
result
<=
a
)
errno
=
0;
else
errno
=
ERANGE;
return
result;
}

/*
*
Returns
the
proct
of
a
and
b
obtained
through
repeated
call
of
add(
).
*
Affects
errno
exactly
as
add(
)
does.
*/
int
multiply(
int
a,
int
b
)
{
int
sign_of_a
=
1,
result
=
0,
i
=
0;
/*
Keep
the
sign
of
multiplier
off
the
loop
sentinel.
*/
if(
a
<
0
)
{
sign_of_a
=
-1;
a
*=
-1;
}
/*
Have
to
reset
errno
here
because
it
won't
be
updated
if
a
is
0.
*/
errno
=
0;
while(
i++
<
a
)
{
result
=
add(
result,
b
);
if(
errno
==
ERANGE
)
break;
}
return
result
*
sign_of_a;
}

int
main(
)
{
int
result;
/*
Operands
too
huge:
sure
overflow.
*/
result
=
multiply(
-5000000,
1374389539
);
if(
errno
==
ERANGE
)
perror(
"Uh
oh"
);
else
printf(
"%d\n",
result
);
/*
Small
operands:
safe.
*/
result
=
multiply(
49,
-972
);
if(
errno
==
ERANGE
)
perror(
"Uh
oh"
);
else
printf(
"%d\n",
result
);
}

當然,應付溢出的最佳方法還是防範:充分了解數據的范圍,選擇恰當的變數類型。
也許你正考慮改用不需要你擔心整數類型溢出的語言。考慮過
Python
嗎?

㈤ C語言溢出判斷問題

#include<inttypes.h>
#include<stdio.h>
int main()
{
int t;
uint64_t a, b;
scanf("%d", &t);
for(int i=0; i<t; i++)
{
scanf("%" SCNu64 "%" SCNu64, &a, &b);
printf("%d\n", a+b<a);
}
return 0;
}

㈥ C語言數據溢出問題

在C語言中,數據的存儲就像一個圓圈,正數溢出數據就會從最小負數開始,負數溢出數據同理,打個比方(簡略寫一下):
int
a=32768,b=-32769;
printf("a=%d,b=%d",&a,&b);
則會輸出a=-32768,b=32767;
這樣則50000輸出就是(50000-32767)+(-32768)+(-1)=-15536

㈦ c語言溢出判斷

#include<stdio.h>
intmain()
{unsignedinta=0,c,n,c1,i;
scanf("%u",&n);
c=1;
for(i=1;i<=n;i++)
{c*=i;
if(c<c1)
{printf("unsignedint最大可以計算%u以內的階乘。 %u!=%u s(%u)=%u",i-1,i-1,c1,i-1,a);
break;
}
a+=i;
c1=c;
}
return0;
}

㈧ c語言 判斷兩數相乘是否溢出

當要發生類型轉換時,如果是像更高精度的類型轉換,編譯器會進行隱式的轉換,也就是說,你用64位的X去和32位的Y相乘,編譯器就會隱式的把Y轉換成64位的,因為精度更高,並不會發生數據丟失,所以不會有任何錯誤報告

㈨ C語言中如何判斷數據類型溢出

一般在工作中會根據實際情況考慮使用合適的數據類型。比如你要存儲一個省的人數,你就不能去選擇char型,而應該選擇int或者能存儲更大數據的類型。
所以通常是通過選擇合適數據類型來避免溢出。
如果非得判斷數據是否溢出,我給你一個方法。通過將其擴大到一個大的數據類型然後進行數據溢出判斷。
eg:
char a = X; //X是隨機數據
int b = a * Y; //Y是隨機數據
if( b < -128 || b > 127) 對於a這種char類型來說則溢出。

㈩ C語言溢出判斷

這個是用VC6寫的控制台程序中從2147483644開始累加的數列,可以看出溢出的時候沒有任何錯誤提示:
2147483644
2147483645
2147483646
2147483647
-2147483648
-2147483647
-2147483646
-2147483645
-2147483644
-2147483643
-2147483642
這個是我寫的可以判斷溢出的加法函數:
#include <stdio.h>

int uoadd (int a,int b,int *overflow);
int overflow;

int main ()
{
int a=2147483647-9,b=10,c=0;

c=uoadd(a,b,&overflow);

if (overflow == 1)
printf ("溢出!\n");
else
printf ("%d\n",c);

return (0);
}

int uoadd (int a,int b,int *overflow)
{
*overflow=0;
if (a>0 && b>0 && a+b<0) *overflow=1;
if (a<0 && b<0 && a+b>0) *overflow=1;
return (a+b);
}
VC6編譯,新建工程的時候選控制台程序

其實其他的應用程序可能會內置判斷溢出的東西,比如VB就會判斷,如果數據溢出了就會彈出一個對話框,其他的就不知道了
其實這個東西用匯編解決相當容易了,但考慮到可讀性還是用C比較好

熱點內容
美圖手機如何解密碼開鎖 發布:2025-03-09 21:14:35 瀏覽:14
行車記錄儀安卓版如何使用 發布:2025-03-09 20:58:03 瀏覽:311
sql登陸不了 發布:2025-03-09 20:45:16 瀏覽:924
如何用本機做伺服器 發布:2025-03-09 20:43:54 瀏覽:44
新時達伺服器如何查故障 發布:2025-03-09 20:31:14 瀏覽:948
sql2005server 發布:2025-03-09 20:31:08 瀏覽:113
過濾sql注入 發布:2025-03-09 20:23:25 瀏覽:992
華為榮耀6大容量存儲 發布:2025-03-09 20:22:34 瀏覽:456
php流圖片 發布:2025-03-09 20:22:27 瀏覽:44
農行密碼多少位 發布:2025-03-09 20:21:55 瀏覽:147