-3
C標準規定算術中的溢出未定義。在C中實現/實施環繞算術運算C
我想知道如何以性能友好的方式實現環繞算法。這意味着像here這樣的溢出檢查解決方案不是一種選擇(因爲它們使操作減慢了大約一個數量級)。
我認爲解決方案將涉及編寫彙編例程來執行此操作。有沒有可用的庫(儘管對於多架構,儘管x86是必須的)。
或者,是否有一個編譯器標誌(gcc & clang)使編譯器強制執行整數算術的環繞語義?
C標準規定算術中的溢出未定義。在C中實現/實施環繞算術運算C
我想知道如何以性能友好的方式實現環繞算法。這意味着像here這樣的溢出檢查解決方案不是一種選擇(因爲它們使操作減慢了大約一個數量級)。
我認爲解決方案將涉及編寫彙編例程來執行此操作。有沒有可用的庫(儘管對於多架構,儘管x86是必須的)。
或者,是否有一個編譯器標誌(gcc & clang)使編譯器強制執行整數算術的環繞語義?
簽名溢出未定義。未簽名的溢出包裝。實現有符號包絡算術主要是在無符號數學中做所有事情。有幾件事情要小心,雖然:
unsigned short
和unsigned char
算術作品通過轉換操作數要麼int
或unsigned int
第一。通常int
,除非你在一個奇怪的設置int
沒有足夠的範圍來存儲所有unsigned short
值。這意味着將short
或char
轉換爲unsigned short
或unsigned char
進行算術運算仍然可以產生有符號整數溢出和UB。你需要在unsigned int
或更大的範圍內做數學運算來避免這種情況。或者,如果你想去編譯器標誌路由,-fwrapv
在GCC和Clang上進行加,減,乘的簽名溢出包裝。不過,它對INT_MIN/-1
沒有任何作用。
「C標準說算術中的溢出是未定義的。」 - 這是非常錯誤的! – Olaf
使用總是定義了溢出的'unsigned'整數或使用'-fwrapv'進行編譯,以在有符號整數上獲得可靠的環繞溢出。 – PSkocik