2016-11-21 83 views
-3

C標準規定算術中的溢出未定義。在C中實現/實施環繞算術運算C

我想知道如何以性能友好的方式實現環繞算法。這意味着像here這樣的溢出檢查解決方案不是一種選擇(因爲它們使操作減慢了大約一個數量級)。

我認爲解決方案將涉及編寫彙編例程來執行此操作。有沒有可用的庫(儘管對於多架構,儘管x86是必須的)。

或者,是否有一個編譯器標誌(gcc & clang)使編譯器強制執行整數算術的環繞語義?

+3

「C標準說算術中的溢出是未定義的。」 - 這是非常錯誤的! – Olaf

+1

使用總是定義了溢出的'unsigned'整數或使用'-fwrapv'進行編譯,以在有符號整數上獲得可靠的環繞溢出。 – PSkocik

回答

3

簽名溢出未定義。未簽名的溢出包裝。實現有符號包絡算術主要是在無符號數學中做所有事情。有幾件事情要小心,雖然:

  1. unsigned shortunsigned char算術作品通過轉換操作數要麼intunsigned int第一。通常int,除非你在一個奇怪的設置int沒有足夠的範圍來存儲所有unsigned short值。這意味着將shortchar轉換爲unsigned shortunsigned char進行算術運算仍然可以產生有符號整數溢出和UB。你需要在unsigned int或更大的範圍內做數學運算來避免這種情況。
  2. 當原始值超出結果類型的範圍時,unsigned-> signed轉換在技術上是實現定義的。這在大多數編譯器和體系結構中都不應該成爲問題。

或者,如果你想去編譯器標誌路由,-fwrapv在GCC和Clang上進行加,減,乘的簽名溢出包裝。不過,它對INT_MIN/-1沒有任何作用。