簡體   English   中英

為什么 c++ assert() 在將負 int 與 unsigned int 進行比較時會錯誤地調用 abort()?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM