2011-03-02 247 views
3

是以下內容的高效和問題,免費的方式,一個unsigned int轉換爲int在C++:避免整數溢出在C++中將unsigned int轉換爲int的有效方法是什麼?

#include <limits.h> 
void safeConvert(unsigned int passed) 
{ 
    int variable = static_cast<int>(passed % (INT_MAX+1)); 
    ... 
} 

還是有更好的辦法?

UPDATE

正如指出的詹姆斯McNellis它不是未定義分配一個unsigned int> INT_MAX整數 - 而這是實現定義。因此,此處的上下文現在特定於我的首選項,即當無符號整數超過INT_MAX時,確保此整數重置爲零。

原始上下文

我有一些用作櫃檯unsigned int類型的,但希望通過他們周圍的特定情況下的整數。

在正常操作下,這些計數將保持在INT_MAX的範圍內。但是爲了避免碰到 undefined 如果發生異常(但有效)的情況,實現特定的行爲我想在這裏進行一些有效的轉換。

+0

應該是'safeConvert'?那麼,當輸入大於INT_MAX時,你想要發生什麼?在這種情況下你想要設置一些標誌嗎? – 2011-03-02 02:51:19

+0

雖然在有符號算術期間溢出會產生未定義的行爲,但轉換爲有符號整數類型不會:如果值不能由目標類型表示,則結果是實現定義的。 – 2011-03-02 02:52:19

+0

@Hamish感謝您的錯字捕捉。當輸入大於INT_MAX時,確保int值大於0爲好。 – 2011-03-02 02:55:09

回答

7

這也應該工作:

int variable = passed & INT_MAX; 
+0

+1。你打了一整分鐘...... :-) – 2011-03-02 02:51:48

+0

@Jerry:我通常發現編寫代碼比解釋更快。代碼只是更密集和更簡潔,打字速度有些限制因素,至少對我而言。 – 2011-03-02 06:17:15

+1

這個解決方案雖然簡潔,但是利用了INT_MAX的實現相關屬性(通常定義爲2 ** n-1)。 OP的目標特別是避免實現定義的行爲。最好通過使用* typedef char Test [((INT_MAX + 1u)&((INT_MAX + 1u) - 1))== 0]; * first;)來檢查此屬性 – decltype 2011-03-02 08:55:38

0

在正常情況下,這些罪名將保持INT_MAX的範圍內。但是,如果發生異常(但有效)的情況發生,爲了避免遇到未定義的行爲,我想在此處進行一些有效的轉換。

高效轉換爲什麼?如果int和unsigned int的所有共享值都相對應,並且您希望其他無符號值(如INT_MAX + 1)各自具有不同的值,則只能將它們映射到負整數值。這是默認完成的,可以用static_cast<int>(my_unsigned)明確要求。否則,您可以將它們全部映射爲0,或-1或INT_MIN,或者丟棄最高位...最簡單的方法是:if (my_unsigned > INT_MAX) my_unsigned = XXX...my_unsigned &= INT_MAX清除高位。但是如果int溢出,被調用的函數是否會正常工作?也許更好的解決方案是使用64位整數開始?

相關問題