2013-04-18 66 views
7

在我使用我的項目,該項目的源文件,有ssize_tsize_t變量之間的比較:演員爲ssize_t或爲size_t

ssize_t sst; 
size_t st; 

if(sst == st){...} 

我想擺脫警告:

warning: comparison between signed and unsigned integer expressions 

但我不確定,我應該向另一個施加哪個變量?

if((size_t)sst == st){...} 

if(sst == (ssize_t)st){...} 

什麼是更安全,更好,更清潔?謝謝

+0

您使用哪種語言? – 2013-04-18 14:59:41

+0

添加標籤,C++。 – rluks

+0

嘗試在無符號整數之前加上'(signed int)'。它現在應該是一個有符號的整數,不會再拋出錯誤了。 – 2013-04-18 15:05:51

回答

16

這個問題沒有一個正確的答案。有幾種可能的答案,取決於你知道什麼先驗關於這些變量可能會採取的值。

  • 如果你知道sst非負,那麼你可以放心地投sstsize_t,因爲這不會改變的值(順便說一句,這是如果你沒有投在所有發生的事情)。

  • 如果sst可能是負面的,但你知道,st不會比SSIZE_MAX大,那麼你可以放心地投stssize_t,因爲這不會改變價值。

  • 如果sst可能是負值,並且st可能大於SSIZE_MAX,那麼這兩種轉換都不正確;任何人都可以更改該值,從而導致不正確的比較。相反,您將執行以下操作if (sst >= 0 && (size_t)sst == st)

如果你不絕對肯定說的前兩種情況之一者,選擇第三個選項,因爲它是在所有情況下是正確的。

+1

+ +1爲簡單的表達式 - 我沒有理由在我的答案中包含'(st <= SSIZE_MAX)'。 –

3

只要兩個值都符合ssize_t的正表示範圍,兩者都可以正常工作。

如果兩個值,你可能由此陷入困境最終 - 測試相等之前檢查這些情況:

if ((sst >= 0) && (st <= SSIZE_MAX) && (sst == (ssize_t)st)) 
{ 
    ... 
} 

(我敢肯定,C++的人會建議你避免C-風格完全轉換 - 我毫不懷疑有人會發表評論或回答,並讓你知道在C++中做到這一點的正確方法。)

+1

一旦你排除'sst <0',你可以轉換爲'size_t'並進行比較。 –

+0

@StephenCanon,是的。 +已經爲你解答了。 –

+1

'static_cast (st)'是一個稍微安全的C++類型。 – Yakk