Cトラップと欠陥-整数のオーバーフロー

951 ワード

一C言語整数演算
C言語には2種類の整数演算が存在し,符号演算と無符号演算がある.
2シンボル整数演算におけるオーバーフロー
無記号算術演算では,いわゆる「オーバーフロー」という言い方はないが,すべての無記号演算は2のn次方をモードとし,ここでnは結果中のビット数である.
演算子のオペランドの1つが符号付き整数であり、もう1つが符号なし整数である場合、符号付き整数は符号なし整数に変換され、「オーバーフロー」も発生しません.
両方のオペランドがシンボル整数である場合、「オーバーフロー」が発生する可能性があり、「オーバーフロー」の結果は定義されていません.1つの演算の結果に「オーバーフロー」が発生した場合、いかなる仮定をしても安全ではありません.
if (a + b < 0)
   complain();
         。 a+b    ”  “ ,                。
  ,      ,                     : , ,    。      ,C            ,a b  ,                ” “。       ”  “ ,                 ,  if          。

3シンボル整数オーバーフロー検出スキーム
1案1
 a b           
if ((unsigned)a + (unsigned)b > INT_MAX)
    complain();
   INT_MAX              ,          。INT_MAX           ,  usigned(a) unsigned(b)           ,                 INT_MAX。

2案2
            
if (a > INT_MAX - b)
    complain();