我想将两个数字相乘,我知道我的数字总是正数,然后:
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
}
代码不会失败,即使我使用的是负数。为什么?
答案 0 :(得分:7)
由于a
和b
未签名,因此永远不会为负。断言失败的唯一方法是,如果其中一个为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)