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

c語言溢出

發布時間: 2022-01-14 06:33:44

① 關於c語言溢出的問題,有代碼

你這個程序的輸出結果就是溢出的輸出結果阿。。
數據類型規定相應的取值范圍,例如int 用2個位元組16位表示,一個位作符號位,剩下15位能表示2的15次方=32768位,於是無符號位的int最多能表示
-32768~32767,也說是說你定義的變數類型是int,但它的數不在這個表示範圍就稱為溢出。以此類推其他類型。

有個初學者的群,有興趣可加入63223976

② 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語言中怎麼處理溢出




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語言整型數據溢出怎麼辦

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

⑤ C語言數據溢出

int

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

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

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

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

⑦ 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語言編譯器。

1、首先,打開C語言編譯器,新建一個初始.cpp文件,例如:test.cpp,輸入問題基礎代碼。

⑨ 一個C語言溢出的問題

首先65536的二進制數是
10000000000000000
17位
你的unsigned
short只有2個位元組16位。
所以機器只將65536的低16位賦給a即
a在機器中等於0000000000000000
所以a等於0啦
溢出應該相當於將一個大格式的數賦給小格式的數。
都是因為分配內存的固定的緣故,你只要記著機器賦值的時候,只給低位
高位的溢出就行了