『壹』 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語言溢出的問題
問題:
1.
變數沒有初始化;
2.
if
(x
+
y
+
z
+
k
==
1)
//
永遠不成立,所以陷入了死循環;
解決辦法:
1.
初始化每個變數;
2.
循環改成:
for
(i=1;
i<=99;
++i)
;
其它3個類似改一下;
然後把判斷條件改為:if
(x
+
y
+
z
+
k
==
100
)
最後賦值的時候:
X
=
x
/
100;
Y
=
y
/
100;
Z
=
z
/
100;
K
=
k
/
100;
這樣就可以得到結果了!
優化建議:
最裡面一層循環完全沒必要:因為前3個變數確定之後,最後一個變數的值也就唯一確定了!
k
=
1-x-y-z;
『叄』 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語言溢出判斷
這個是用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比較好
『伍』 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( ) 一樣。
當然,應付溢出的最佳方法還是防範:充分了解數據的范圍,選擇恰當的變數類型。
『陸』 c語言溢出問題
對於正數,反碼,補碼與原碼相同。
對於負數,補碼是原碼的符號位不變,數值部分按位取反再加1。
short型數據是16位表示最高位是符號位,所以只有15位表示數值,15位000000000000000-111111111111111表示的范圍是0-32767,又加上最高位的符號位(第16位),就可以表示-32768-32767 。unsigned short型數據是16位都用來表示數值,16位0000000000000000-1111111111111111表示的范圍是0-65535。
計算機在進行計算時是用補數計算的,且如果溢出會進行丟位處理。如short型32767補碼是0111111111111111 加1後為1000000000000000(注意最高位是符號位),1000000000000000正是-32768的補數。
而unsigned short型數據無符號65535為1111111111111111(16位),加1後為10000000000000000(17位)這時計算機判斷溢出後丟棄第17位,變為0000000000000000就是0了^_^
『柒』 關於c語言中的溢出問題
這種計算是錯的。
C語言並不檢查運算過程中是否「溢出」。即使溢出仍然繼續運算的。
『捌』 C語言中如何判斷數據類型溢出
一般在工作中會根據實際情況考慮使用合適的數據類型。比如你要存儲一個省的人數,你就不能去選擇char型,而應該選擇int或者能存儲更大數據的類型。
所以通常是通過選擇合適數據類型來避免溢出。
如果非得判斷數據是否溢出,我給你一個方法。通過將其擴大到一個大的數據類型然後進行數據溢出判斷。
eg:
char a = X; //X是隨機數據
int b = a * Y; //Y是隨機數據
if( b < -128 || b > 127) 對於a這種char類型來說則溢出。
『玖』 C語言關於數據溢出
這不是數據溢出。這是由於沒有指定小數位數(系統默認輸出6位小數,加上2位整數,就是要輸出8位數字),float只能保證7位有效數字,多餘位數上的數字是無效的。
如果以%.1f或%g格式輸出,就不會出這種錯了。
如果改為double類型(相應地,輸入語句要改為%lf格式),這樣可以有15位有效數字,也不會出這種錯的。
『拾』 在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;
}