检查无符号是否小于零

时间:2012-06-21 14:58:15

标签: c

与一些消息来源一起发现如下代码:

void foo(unsigned int i)
{
 if(i<0)
     printf("Less then zero\n");
 else
     printf("greater or equ\n");
}

int main()
{
    int bar = -2;
    foo(bar);
    return 0;
}

我认为没有任何意义,但可能会有一些案例(安全性?)使这项检查变得合理吗?

2 个答案:

答案 0 :(得分:13)

根据定义,unsigned int不能小于0。所以,为了更直接地回答你的问题,你认为这是没有意义的。它不是一个有意义的安全项,除非你遇到一个循环,它意外地将一个有符号的int减去0,然后将它作为unsigned int转换为一个数组的索引,从而索引数组之外的内存。

答案 1 :(得分:2)

i始终为>=0,因为它被声明为unsigned,因此被解释为无符号整数。 所以你的第一次测试总是错误的。

您的通话foo(bar)实际上会将int转换为unsigned int。这可能会让你感到困惑。并且“转换”实际上并不会改变整数的字节/位值,这只是正式输入和解释的问题。

有关签名/未签名转换的示例,请参阅此answer

这是一个简单的例子(确切的输出取决于系统上unsigned int的字节数,对我而言是4字节)。

代码:

printf("%u\n", (unsigned int) -2);

输出:

4294967294