C 检查unsigned是否小于零

C 检查unsigned是否小于零,c,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; } void foo(无符号整数i) { 如果(i根据定义,无符号整数不能小于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;
}
void foo(无符号整数i)
{

如果(i根据定义,无符号整数不能小于0。因此,为了更直接地回答您的问题,您正确地认为这没有意义。它也不是一个有意义的安全项,除非您遇到类似循环的情况,该循环意外地将有符号整数递减到0之后,然后将其强制转换为无符号整数,用作索引到n数组,因此对数组外部的内存进行索引。

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

您的调用
foo(bar)
实际上将
int
转换为
无符号int
。这可能会让您感到困惑。而且“转换”实际上不会更改整数的字节/位值,它只是一个正式的键入和解释问题

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

下面是一个简单的示例(确切的输出取决于系统上
无符号int
的字节数,对我来说是4个字节)

代码:

输出:

4294967294

揭示了当你从负值int转换为无符号int时会发生什么。谢谢你的回答!你增强了我的信心。但是有人写了这篇文章。可能有一些平台或编译器以另一种方式思考吗?有符号/无符号转换的精确值可能会有一些细微的变化,这取决于大小o系统上的一个int(参见jonnyGold和wap26链接的答案)。但在这种情况下,所有编译器都将输出显示相同控制流行为的可执行文件。换句话说——否:)写这篇文章的人可能没有注意到会发生这种控制流情况(错误)或者他们正在试验。看起来你是对的。我做了一些检查。gcc只是删除了所有检查并写入字符串:
foo:pushl%ebp movl%esp,%ebp subl$24%esp movl$.LC0,(%esp)call puts leave ret
Clang生成检查,但是:1.void foo(unsigned int I)内联
foo+19:jae 0x804841f
2.无效foo(带符号的int i):内联
foo+19:jge 0x804841f
4294967294