![](/img/trans.png)
[英]Iterating over a for loop in C++ and comparing the iterator to a negative number. Can an int store an unsigned int?
[英]Why does c++ assert() falsely call abort() when comparing a negative int to an unsigned int?
我在我的 c++ 程序中發現 assert() 在類似於以下代碼片段的情況下調用 abort():
int a = -1;
unsigned int b = 5;
assert(a < b);
作為一個人,我可以說 -1 肯定小於 5,不管一個是 int 而另一個是 unsigned int。 為什么編譯器不能?
我已經找到了解決方案,這個斷言是荒謬的,因為無符號的總是正數(我有點忘記了我實際代碼中的變量是無符號的),但我很好奇為什么會這樣.
當您將帶符號的 integer 與無符號的 integer 進行比較時,編譯器會隱式地將有符號值轉換為無符號值,因此本質上:
int a = -1;
unsigned int b = 5;
assert(a < b);
相當於:
assert(static_cast<unsigned>(-1) < static_cast<unsigned>(5));
現在,因為無符號整數不能保存負值, -1
由於integer 溢出而返回到UINT_MAX
:
assert(UINT_MAX < static_cast<unsigned>(5));
這顯然是錯誤的,因為UINT_MAX
大於 5,所以斷言失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.