当我尝试输入此 while 语句时,我有一个奇怪的行为:
unsigned u = 0;
int i = -2;
while(i < u)
{
// Do something
i++;
}
但它永远不会进入,即使我设置了一个断点i = -2
并且u = 0
. 我究竟做错了什么?我该如何解决这个问题?
当我尝试输入此 while 语句时,我有一个奇怪的行为:
unsigned u = 0;
int i = -2;
while(i < u)
{
// Do something
i++;
}
但它永远不会进入,即使我设置了一个断点i = -2
并且u = 0
. 我究竟做错了什么?我该如何解决这个问题?
这是因为 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++;
}
顺便说一句,您的编译器可能应该给您一个警告。
你正在比较一个有符号和无符号整数,你的问题从那里开始......
不要那样做,它应该可以正常工作。