當前位置:首頁 » 編程語言 » c語言中數據溢出怎麼解決
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言中數據溢出怎麼解決

發布時間: 2022-03-15 19:55:47

⑴ (c語言)整型數據的溢出

其實這個問題很簡單的,這個可能和你編譯器環境有關,int 類型表示範圍是-32768-32767。所以你可以把它的表示範圍比作一個圓。因為在電腦中負數是按補碼保存的,所以加1之後會出現進位。如果是char 類型表示-128-127的話,那麼char a = 128也會變成-128的。

你可以看一下下面的圖,這個圓就好比表示的范圍。如果不信的話你可以將int a = 32769;試試的,輸出應該會變成-32787

⑵ 急求 c語言整型數據溢出怎麼辦

按道理10的9次方是在無符號長整形范圍內,不應該會溢出的.

⑶ 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語言,數據溢出了怎麼辦

1 1
2 2
3 6
4 24
5 120
6 720
7 5040
8 40320
9 362880
10 3628800
11 39916800
12 479001600
13 6227020800
14 87178291200
15 1307674368000
16 20922789888000
17 355687428096000
18 6402373705728000
19 121645100408832000
20 2432902008176640000
21 51090942171709440000
22 1124000727777607680000
23 25852016738884976640000
24 620448401733239439360000
25 15511210043330985984000000
26 403291461126605635584000000
27 10888869450418352160768000000
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
2.71828182846 <type 'float'>
估計C的基本數據類型都會溢出

可以把它看做字元串,模擬加減乘除
或者用其他語言

⑸ C語言數據溢出問題

100000
*
200000
超出int范圍了。
有兩種解決方法,
1.long
long
d;
d
=
(long
long)m*n
2.c
=
m
/
最大公約數
*n
;這樣先除再乘就不會溢出了

⑹ C語言數據溢出

int

佔4位元組(所佔位元組和編譯器有關的,此處所說的是在VC上,比如在TC或BC上佔2位元組)
有符號
int
范圍
-2^31~2^31-1
無符號
int
范圍
0~2^32-1
如果超出這個范圍就會溢出

⑺ 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語言數據溢出是如何處理

用圓來形容int吧·他從0開始旋轉~當超過最大值的時候系統就溢出了,就會轉到負數的那一邊~大概就是這個意思~我記不清他具體值了~

⑼ C語言中數值溢出的問題

如果說短整型的長度是2個位元組,
short int 的范圍就是-32768~32767
32768比最大值多1,也就是變成最小值了。
你的計算也不對。
應該是這樣計算的:32768是:1000 0000 0000 0000
要把這個補碼求原碼,即是補碼-1再取反,然後加上負號。
1000 0000 0000 0000 -1=0111 1111 1111 1111
取反即是:1000 0000 0000 0000 (正數32768)
加上負號:-32768
所以結果是-32768

⑽ C語言的數據溢出怎麼處理呀

你把 double BMI=(kil ......這條語句放到
printf("%lf\n",BMI");之前即可;