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