簡體   English   中英

斷言unsigned int確實是正面的不起作用?

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

}

代碼不會失敗,即使我使用的是負數。 為什么?

因為ab是無符號的,所以它們永遠不會是負數。 斷言失敗的唯一方法是其中一個為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.

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