[英]Assert that unsigned int a indeed positive doesn't work ?
我想將兩個數字相乘,我知道我的數字總是正數,然后:
unsigned int mulPositiveNumbers(unsigned int a ,unsigned int b)
{
assert(a > 0);
assert(b > 0);
return (a*b);
}
現在,我正在使用斷言告訴自己“給定的數字總是積極的”。
但是當我跑步時:
int main()
{
unsigned int res = mulPositiveNumbers(-4,3);
// more stuff goes here
}
代碼不會失敗,即使我使用的是負數。 為什么?
因為a
和b
是無符號的,所以它們永遠不會是負數。 斷言失敗的唯一方法是其中一個為0。
當您使用signed int作為參數調用函數時,它將在函數執行之前簡單地轉換為unsigned(因此在檢查斷言之前)。 將負整數轉換為無符號將產生正整數,因為正如我所說,沒有負無符號整數。
你沒有使用負數,它被轉換為unsigned int
因為這是函數作為參數所用的。
斷言只有在數字為0
才會失敗。
您的類型'unsigned int'將隱式-4轉換為無符號等效
因為-4解釋為無符號(32位)int是4294967291
,這肯定是正面的。
以下應該按照您的意願工作。
unsigned int mulPositiveNumbers(int a, int b)
{
assert(a > 0); // Fail for (-4, 3)
assert(b > 0);
return (a*b);
}
當你在它的時候,你也應該斷言乘法的結果是否會溢出,或者選擇一個更大的返回類型(例如long long )
嘗試這個:
(unsigned int a ,unsigned int b)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.