断言unsigned int确实是正面的不起作用?

时间:2012-08-29 09:55:43

标签: c++ assert unsigned unsigned-integer

我想将两个数字相乘,我知道我的数字总是正数,然后:

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

}

代码不会失败,即使我使用的是负数。为什么?

5 个答案:

答案 0 :(得分:7)

由于ab未签名,因此永远不会为负。断言失败的唯一方法是,如果其中一个为0。

当您使用signed int作为参数调用函数时,它将在函数执行之前简单地转换为unsigned(因此在检查断言之前)。将负整数转换为无符号将产生正整数,因为正如我所说,没有负无符号整数。

答案 1 :(得分:3)

你没有使用否定词,它被转换为unsigned int,因为这就是函数作为参数所用的内容。

如果数字为0,则断言只会失败。

答案 2 :(得分:3)

你的类型'unsigned int'隐含地将-4转换为无符号等价

答案 3 :(得分:1)

因为-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

答案 4 :(得分:0)

试试这个:

(unsigned int a ,unsigned int b)