判斷整數溢位

2021-09-25 06:57:53 字數 833 閱讀 1848

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

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

c語言中存在兩類整數算術運算,有符號運算和無符號運算。在無符號運算裡,沒有了符號位,所以是沒有溢位的概念的。所有的無符號運算都是以2的n次方為模。如果算術運算子的乙個運算元是有符號書,另乙個是無符號數,那麼有符號數 會被轉換為無符號數 表示範圍小的總是被轉換為表示範圍大的 那麼溢位也不會發生。但是,...

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

c語言中存在兩類整數算術運算,有符號運算和無符號運算。在無符號運算裡,沒有了符號位,所以是沒有溢位的概念的。所有的無符號運算都是以2的n次方為模。如果算術運算子的乙個運算元是有符號書,另乙個是無符號數,那麼有符號數 會被轉換為無符號數 表示範圍小的總是被轉換為表示範圍大的 那麼溢位也不會發生。但是,...

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

c語言中存在兩類整數算術運算,有符號運算和無符號運算。在無符號運算裡,沒有了符號位,所以是沒有溢位的概念的。所有的無符號運算都是以2的n次方為模。如果算術運算子的乙個運算元是有符號書,另乙個是無符號數,那麼有符號數 會被轉換為無符號數 表示範圍小的總是被轉換為表示範圍大的 那麼溢位也不會發生。但是,...