4

我想将两个数字相乘,并且我知道我的数字总是正数,那么:

unsigned int mulPositiveNumbers(unsigned int a ,unsigned int b)
{
    assert(a > 0);
    assert(b > 0);
    return (a*b);
}

现在,我用 assert 告诉自己“给定的数字总是正数”。

但是当我运行时:

int main()
{

    unsigned int res = mulPositiveNumbers(-4,3);

        // more stuff goes here

}

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

4

5 回答 5

7

因为ab是无符号的,所以它们永远不会是负数。您的断言失败的唯一方法是其中一个为 0。

当您使用带符号的 int 作为参数调用函数时,它只会在函数执行之前(因此在您的断言被检查之前)转换为无符号的 it。将负整数转换为无符号整数将产生一个正整数,因为正如我所说,没有负无符号整数。

于 2012-08-29T09:58:04.913 回答
3

你没有使用负数,它被转换为一个,unsigned int因为这是函数作为参数的。

只有当数字为 时,断言才会失败0

于 2012-08-29T09:57:16.850 回答
3

您的类型 'unsigned int' 将 -4 隐式转换为无符号等效项

于 2012-08-29T09:57:24.427 回答
1

因为 -4 解释为无符号(32 位) int is 4294967291,这绝对是正数。

以下应该按您的意愿工作。

unsigned int mulPositiveNumbers(int a, int b)
{
    assert(a > 0); // Fail for (-4, 3)
    assert(b > 0);
    return (a*b);
}

当您使用它时,您还应该断言乘法的结果是否会溢出,或者选择更大的返回类型(例如long long

于 2012-08-29T10:09:27.770 回答
0

试试这个:

(unsigned int a ,unsigned int b)
于 2012-08-29T09:57:34.723 回答