6

使用一些来源发现代码如下:

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;
}

我认为没有任何意义,但可能存在某些情况(安全性?)使此检查有意义?

4

2 回答 2

12

根据定义,无符号整数不能小于 0。因此,为了更直接地回答您的问题,您认为这没有任何意义是正确的。它也不是一个有意义的安全项目,除非您遇到类似循环的情况,该循环意外地将有符号 int 递减到 0 以上,然后将其转换为无符号 int 以用作数组的索引,从而索引数组外的内存。

于 2012-06-21T15:00:10.870 回答
2

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

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

有关有符号/无符号转换的示例,请参见此答案

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

代码:

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

输出:

4294967294
于 2012-06-21T15:03:38.870 回答