2016-04-11 33 views
1

此C表達式總是評估爲真?位操作難題

((x+y)<<4) + y - x == 17*y +15*x 

從我可以告訴算法是正確的,但我對是什麼將溢出的情況下發生的不確定 的唯一的事情。

我的理解是,C乘法表達式處理溢出 相同的方式作爲位移,但我不確定。

有沒有人知道這個答案?

+5

您是否嘗試運行代碼並故意造成溢出? –

+1

這些變量的類型是什麼?特別是有符號還是無符號? – user2357112

+1

提供[mcve]。該表達式可能會在** all **操作中調用未定義的行爲。 – Olaf

回答

-1

答案是「否」,特別是在溢出的情況下。

正如你可以從答案here看到的,大多數計算機是二進制補碼,但它們不一定是(並且歷史上已經有一些補充計算機),並且溢出錯誤因此是未定義的行爲。

它可能在您的計算機上工作,但不能保證可以工作。

+0

它是*補碼*,而不是*恭維* –

+1

無論是否使用2的補碼,簽名溢出都是UB –

2

您可以通過SAT solver運行此類示例來檢查您剛纔指定的方程或公式的可滿足性。

我沒有找到它滿足您的任何約束X或Y(即:不存在在這個等式產生收入差距的任何X或Y)

(declare-const x (_ BitVec 32)) 
(declare-const y (_ BitVec 32)) 

(assert (not (= (bvsub (bvadd (bvshl (bvadd x y) #x00000004) y) x) 
       (bvadd (bvmul #x00000011 y) (bvmul #x0000000f x))))) 

(check-sat) 
(get-model) 

在問候溢出,邏輯上bitvectors一般不提供有符號位數和無符號位數作爲數字。相反,比特向量理論提供了算術運算的特殊簽名版本,不管該比特向量是作爲有符號還是無符號處理,它都有所不同。我已經使用適當的操作符到您指定的公式。當然,您可以將結果代數化爲(x+y)<<4 == 16y + 16x,但SMT解算器處理像溢出這樣的情況很難正式確定)。

無論你的指令字大小,沒有XY可以產生不平等。

+0

這個「C」代碼如何? – Soren

+0

它是一個關於比特向量決策程序的正式「驗證」,它是C程序所居住的數字「世界」的抽象模型。 –

+0

我不認爲科學和數學是如何工作的 - 你有「沒有證據」,這並不能證明什麼 – Soren