使用一些来源发现代码如下:
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;
}
我认为没有任何意义,但可能存在某些情况(安全性?)使此检查有意义?
使用一些来源发现代码如下:
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;
}
我认为没有任何意义,但可能存在某些情况(安全性?)使此检查有意义?
根据定义,无符号整数不能小于 0。因此,为了更直接地回答您的问题,您认为这没有任何意义是正确的。它也不是一个有意义的安全项目,除非您遇到类似循环的情况,该循环意外地将有符号 int 递减到 0 以上,然后将其转换为无符号 int 以用作数组的索引,从而索引数组外的内存。
i
将始终是>=0
,因为它被声明为unsigned
并因此被解释为无符号整数。所以你的第一个测试总是错误的。
您的调用foo(bar)
实际上将 aint
转换为unsigned int
. 这可能会让你感到困惑。并且“转换”实际上并没有改变整数的字节/位值,它只是正式输入和解释的问题。
有关有符号/无符号转换的示例,请参见此答案。
这是一个简单的示例(确切的输出取决于unsigned int
系统上的字节数,对我来说是 4 个字节)。
代码:
printf("%u\n", (unsigned int) -2);
输出:
4294967294