比較C中的負數
回答
你必須瞭解不同變量類型之間的區別。變量類型如int
,unsigned
,size_t
等有不同的行爲,並基於你得到的結果。
如果你真的想比較兩個數字,他們都必須在同一水平(變量類型),否則你會得到意想不到的結果。
以下將解決您的問題。
if(tmp > (int)len)
ft_putstr("this is crazy");
由於@jblixr建議(對於評論的感謝),你可能要採取sizeof
這些變量類型的照顧,並確保當從一種數據類型轉換值到另一種數據類型的值不被丟失。
你認爲這是一個很好的解決方案啊?如果'len'與'4294967295'類似,會發生什麼?那麼'len'將被視爲負數。 –
@jblixr如果您指的是sizeof'size_t'和'int';沒有。 – Pawan
「size_t」值大於「INT_MAX」的可能性有多大?不是特別的。這種比較在大多數情況下都很好。 –
這裏的問題是,你正試圖比較一些未簽名的東西和已簽名的東西。這意味着在實際轉換完成之前有一個隱式轉換。在這種情況下,signed被轉換爲unsigned(這通常不是人們想要的 - 因此許多編譯器可以選擇在完成時顯示警告)。
要做到這一點你會寫一個草率的方式比較正確:
if((int)tmp > (int)len)
但是這忽略了一個事實size_t
可以有一個是int
值過大。嚴格來說,必須處理int
與size_t
的範圍相結合的範圍可以大於任何可用的類型。這意味着你將不得不在兩種情況下處理這個問題,所以你會使用這個事實,即如果tmp<0
那麼tmp<len
(數學上,因爲len>=0
)。因此,例如在數學上tmp<len
將被寫爲tmp<0 || tmp<len
。而相反的是tmp>=0 && tmp >= len
。因此,你應該寫:
if(tmp >= 0 && tmp > len)
注意,則轉換是沒有問題的,tmp
可以在第一次檢查後轉換爲無無值改變,int
和size_t
不同範圍也不是問題作爲比較之前,較小者轉換爲較寬範圍。
剩下的唯一問題是,如果您啓用了關於帶符號無符號比較的警告(以檢測這些類型的錯誤),它仍會警告。爲了照顧到這一點,您需要明確地輸入它,但是我們知道一旦我們檢查了tmp>=0
,轉換爲無符號不會改變tmp
。因此,爲了避免警告你可以這樣寫:
if(tmp >= 0 && (unsigned)tmp > len))
的(unsigned)
是因爲tmp
是int
,你需要轉換爲無符號時,如果tmp
是另一種類型的尊重類型。
- 1. 比較負數中的負數
- 2. 負整數比較
- 3. 比較JQuery函數中的負數
- 4. 在Acrobat中比較負值
- 5. 比較C中的數字
- 6. Java的整數MIN_VALUE負,則比較
- 7. python比較正數和負數
- 8. Apache RewriteCond中變量的負面比較
- 9. 整數比較C#
- 10. 比較整數C++
- 11. C++比較雙數
- 12. 將數值與js中Datatable中的負數進行比較
- 13. 服務器負載比較
- 14. 熊貓 - 比較正/負值
- 15. c#中比較位圖(簽名)比較#
- 16. 在c/C++中比較float和整數
- 17. 比較和比較的負值和正值返回值
- 18. 比較C++中的2個整數
- 19. 比較兩個數據表中的c#
- 20. C# - 比較兩個數組中的值
- 21. C++比較數組中的列元素
- 22. C++中的數組字符串比較
- 23. C++中的可比較數組
- 24. 比較C++中的數組元素
- 25. 比較C++中數組的元素
- 26. 字符串比較與目標C中的類比較-C
- 27. c中的字符比較?
- 28. 比較C++中的空缺
- 29. C中的字符比較
- 30. 比較C++中的雙打
這是因爲'size_t'是一個無符號整數類型,所以當比較一個有符號整數類型時,就會執行無符號比較。 –
嘗試'if(tmp> 0 && tmp> len)' – user3386109
'printf(「%zu」,tmp);'會導致未定義的行爲。使用'printf',您可以使用正確的格式說明符。 –