如何判斷整數資料的溢位

2022-01-10 03:35:26 字數 2109 閱讀 8856

1樓:

整數溢位,如何判斷整數溢位 收藏

c語言中存在兩類整數算術運算,有符號運算和無符號運算。在無符號運算裡,沒有了符號位,所以是沒有溢位的概念的。

所有的無符號運算都是以2的n次方為模。如果算術運算子的乙個運算元是有符號書,另乙個是無符號數,那麼有符號數

會被轉換為無符號數(表示範圍小的總是被轉換為表示範圍大的),那麼溢位也不會發生。但是,當兩個運算元都是有符號數

時,溢位就有可能發生。而且溢位的結果是未定義的。當乙個運算的結果發生溢位時,任何假設都是不安全的。

例如,假定a和b是兩個非負的整型變數(有符號),我們需要檢查a+b是否溢位,一種想當然的方式是:

if (a + b < 0)

溢位;實際上,在現實世界裡,這並不能正常執行。當a+b確實發生溢位時,所有關於結果如何的假設均不可靠。比如,在某些

機器的cpu,加法運算將設定乙個內部暫存器為四種狀態:正,負,零和溢位。在這種機器上,c編譯器完全有理由實現以上

的例子,使得a+b返回的不是負,而是這個記憶體暫存器的溢位狀態。顯然,if的判斷會失敗。

一種正確的方式是將a和b都強制轉換為無符號整數:

if ( (unsigned)a + (unsigned)b > int_max)

溢位;這裡的int_max值為有符號整型的最大值。在一般的編譯器裡是乙個預定義的常量。ansi c在limits裡定義了int_max,值為

2的31次方-1.

不需要用到無符號算數運算的另一種可行方法是:

if (a > int_max - b )

溢位;ps : 有符號數的最高位(31位)為符號位,最高位為0的時候,表示正,為1的時候表示負。運算時,符號位不參加運算,但是如果兩個數相加,30位需要進1時,那麼即表示溢位。

2樓:匿名使用者

c語言中存在兩類整數算術運算,有符號運算和無符號運算。在無符號運算裡,沒有了符號位,所以是沒有溢位的概念的。

所有的無符號運算都是以2的n次方為模。如果算術運算子的乙個運算元是有符號書,另乙個是無符號數,那麼有符號數

會被轉換為無符號數(表示範圍小的總是被轉換為表示範圍大的),那麼溢位也不會發生。但是,當兩個運算元都是有符號數

時,溢位就有可能發生。而且溢位的結果是未定義的。當乙個運算的結果發生溢位時,任何假設都是不安全的。

例如,假定a和b是兩個非負的整型變數(有符號),我們需要檢查a+b是否溢位,一種想當然的方式是:

if (a + b < 0)

溢位;實際上,在現實世界裡,這並不能正常執行。當a+b確實發生溢位時,所有關於結果如何的假設均不可靠。比如,在某些

機器的cpu,加法運算將設定乙個內部暫存器為四種狀態:正,負,零和溢位。在這種機器上,c編譯器完全有理由實現以上

的例子,使得a+b返回的不是負,而是這個記憶體暫存器的溢位狀態。顯然,if的判斷會失敗。

一種正確的方式是將a和b都強制轉換為無符號整數:

if ( (unsigned)a + (unsigned)b > int_max)

溢位;這裡的int_max值為有符號整型的最大值。在一般的編譯器裡是乙個預定義的常量。ansi c在limits裡定義了int_max,值為

2的31次方-1.

不需要用到無符號算數運算的另一種可行方法是:

if (a > int_max - b )

溢位;ps : 有符號數的最高位(31位)為符號位,最高位為0的時候,表示正,為1的時候表示負。運算時,符號位不參加運算,但是如果兩個數相加,30位需要進1時,那麼即表示溢位。

3樓:

(1)無符號整數相加,如果結果小於其中任何乙個,則溢位;

bool isoverflow(unsigned x, unsigned y)

(2) 有符號整數相加,比無符號的相對複雜一點兒:

如果兩個整數相加<0,或者兩個負數相加》0,(負數在計算機中用補碼表示)則溢位。

bool isoverflow(int x, int y)(3)如何判斷乙個輸入或者轉化轉化的單個數字是否溢位;if( num>0x7fffffff || num<(signed int)0x80000000)

int型別的最大正數:0x7fffffff;

int型別的最小負數:0x80000000;

c語言如何判斷整數,c語言判斷乙個數是否為整數

c語言判斷兩數相除結果是否為整數可採用模運算。是c語言提供的 模運算 符,如8 5表示8整除5,取其餘數,結果為3 c語言要求參與模運算子兩端的數,必須是整型類資料,如 char short int long,unsigned這些型別,不能是浮點型別資料。如,判斷乙個數除以100後是不是整數,該數是...

c語言問題輸入整數n和它的進製d判斷整數

include int fun int n,int d int index 0,x,y,i x n y n d while x 0 for i 0 i index 2 i return 1 void main else include include using namespace std stat...

通過表單提交登入資料時如何判斷輸入的帳號密碼和驗證碼是否正確

先判斷賬號在資料庫中存不存在,如果存在就取出那條記錄,判斷密碼正不正確 我想這個問題是不是沒問到重點呢 用form表單做個登入介面,單擊登入後驗證資料是否和資料庫裡的一致,怎麼做。5 你不是都寫出來了嘛,使用者登入驗證 是必須到後台去驗證的,大致是先 點驗證,然後form 提交到 action 方法...