与一些消息来源一起发现如下代码:
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 :(得分: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