0

可能重复:
无符号和有符号比较
unsigned int 和有符号字符比较

当我尝试输入此 while 语句时,我有一个奇怪的行为:

unsigned u = 0;
int i = -2;

while(i < u)
{
    // Do something
    i++;
}

但它永远不会进入,即使我设置了一个断点i = -2并且u = 0. 我究竟做错了什么?我该如何解决这个问题?

4

2 回答 2

6

这是因为 ANSI C 标准定义,只要在限定类型 (your unsigned int u) 和非限定类型 (your int i) 之间进行比较,非限定类型就会提升为相同类型的类型(因此总是int),但也继承其他数量的限定词(即它变成unsigned)。

当你的int,其值等于-2,成为unsigned第一个字节时,经历了这种转变:0000 0010 -> 1111 1110。你int现在是一个非常大的正数,肯定比你的更大unsigned int

有一个解决方案:cast tosigned

while(i < (signed) u)
{
    // Do something
    i++;
}

顺便说一句,您的编译器可能应该给您一个警告。

于 2012-06-01T11:52:12.063 回答
2

你正在比较一个有符号和无符号整数,你的问题从那里开始......
不要那样做,它应该可以正常工作。

于 2012-06-01T11:51:52.277 回答