整數溢出,如何判斷整數溢出

來源:互聯網
上載者:User

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時,那麼即表示溢出。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.