2014-06-12 37 views
1

我遇到了一個惱人的錯誤在我的代碼:爲什麼剩餘操作符會因不同的數據類型而失敗?

length = 60; 
index = -1; 
rem = index % length; 

在調試器中,我看到了rem,而不是-1,這沒有任何意義,我值15。原來,length類型爲unsigned intindex類型爲int。更改length的類型爲int解決了該問題。

但是,我不明白哪裏出了問題。鑑於剩餘操作的定義((a/b)*b + a%b == a),我可能預期由於不同的類型而出現符號錯誤,但我沒有預料到隨機值爲15.(儘管60/4 = 15,所以也許有些位被移位了? )

我的問題是:爲什麼剩餘操作在作爲操作數提供帶符號和無符號整數時失敗?哪些實現細節會導致這種情況?

(使用GCC 4.8.2)

+0

@nos:重新開放。隨意張貼,作爲答案。 –

回答

1

您1無符號和1符號的變量作爲操作數的二進制運算符%,在該casethe符號變量被轉換成無符號類型。 (你可以閱讀這些轉換規則here摘要)

所以你-1轉換爲無符號值,這將是(假設int是32位)0xffffffff 0xffffffff % 6015

+0

這回答了這個問題。我曾預計無符號整數將轉換爲有符號整數,因爲您不會丟失信息。但是,我現在意識到你不能這樣做,因爲無符號整數的範圍不適合有符號整數。 – Ludo

相關問題