第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

檢測C / C ++中的帶符號溢出

檢測C / C ++中的帶符號溢出

C++ C
MM們 2019-08-27 13:28:51
檢測C / C ++中的帶符號溢出乍一看,這個問題看起來像是如何檢測整數(shù)溢出的重復(fù)?然而,它實(shí)際上是顯著不同的。我發(fā)現(xiàn)雖然檢測無符號整數(shù)溢出非常簡單,但在C / C ++中檢測帶符號的溢出實(shí)際上比大多數(shù)人想象的要困難。最明顯但又天真的方式是這樣的:int add(int lhs, int rhs){  int sum = lhs + rhs;  if ((lhs >= 0 && sum < rhs) || (lhs < 0 && sum > rhs)) {   /* an overflow has occurred */   abort();  }  return sum; }這個問題是根據(jù)C標(biāo)準(zhǔn),有符號整數(shù)溢出是未定義的行為。 換句話說,根據(jù)標(biāo)準(zhǔn),只要您甚至導(dǎo)致簽名溢出,您的程序就像取消引用空指針一樣無效。因此,您不能導(dǎo)致未定義的行為,然后嘗試在事后檢測溢出,如上面的后置條件檢查示例。盡管上面的檢查很可能適用于許多編譯器,但你不能指望它。實(shí)際上,因?yàn)镃標(biāo)準(zhǔn)說未定義有符號整數(shù)溢出,所以一些編譯器(如GCC)將在設(shè)置優(yōu)化標(biāo)志時優(yōu)化上述檢查,因?yàn)榫幾g器假定有符號溢出是不可能的。這完全打破了檢查溢出的嘗試。因此,檢查溢出的另一種可能方法是:int add(int lhs, int rhs){  if (lhs >= 0 && rhs >= 0) {   if (INT_MAX - lhs <= rhs) {    /* overflow has occurred */    abort();   }  }  else if (lhs < 0 && rhs < 0) {   if (lhs <= INT_MIN - rhs) {    /* overflow has occurred */    abort();   }  }  return lhs + rhs;}這似乎更有希望,因?yàn)槲覀儗?shí)際上并沒有將兩個整數(shù)加在一起,直到我們事先確定執(zhí)行這樣的添加不會導(dǎo)致溢出。因此,我們不會導(dǎo)致任何未定義的行為。但是,遺憾的是,此解決方案的效率遠(yuǎn)低于初始解決方案,因?yàn)槟仨殘?zhí)行減法操作才能測試您的添加操作是否有效。即使你不關(guān)心這個(?。┬阅艽驌?,我仍然不完全相信這個解決方案是足夠的。表達(dá)式lhs <= INT_MIN - rhs看起來就像編譯器可能優(yōu)化的那種表達(dá)式,認(rèn)為簽名溢出是不可能的。那么這里有更好的解決方案嗎?保證1)不會導(dǎo)致未定義的行為,2)不為編譯器提供優(yōu)化溢出檢查的機(jī)會?我想可能有一些方法可以通過將兩個操作數(shù)轉(zhuǎn)換為無符號來執(zhí)行它,并通過滾動自己的二進(jìn)制補(bǔ)碼算法來執(zhí)行檢查,但我不確定如何做到這一點(diǎn)。
查看完整描述

3 回答

?
蝴蝶刀刀

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超8個贊

不,你的第二個代碼不正確,但你很接近:如果你設(shè)置了

int half = INT_MAX/2;int half1 = half + 1;

添加的結(jié)果是INT_MAX。(INT_MAX總是一個奇數(shù))。所以這是有效的輸入。但是在你的日常生活中INT_MAX - half == half1,你將會中止。誤報。

可以通過放入<而不是<=在兩個檢查中修復(fù)此錯誤。

但是那時你的代碼也不是最優(yōu)的。以下是:

int add(int lhs, int rhs){
 if (lhs >= 0) {
  if (INT_MAX - lhs < rhs) {
   /* would overflow */
   abort();
  }
 }
 else {
  if (rhs < INT_MIN - lhs) {
   /* would overflow */
   abort();
  }
 }
 return lhs + rhs;}

要看到這是有效的,你必須象征性地lhs在不等式的兩邊添加,這給出了你的結(jié)果超出范圍的算術(shù)條件。


查看完整回答
反對 回復(fù) 2019-08-27
  • 3 回答
  • 0 關(guān)注
  • 659 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號