无法输入while语句
可能重复:
未签名和签名的比较
unsigned int和signed char比较
当我尝试输入这个while语句时,我有一个奇怪的行为:
unsigned u = 0; int i = -2; while(i < u) { // Do something i++; }
但它永远不会进入,即使我设置了一个断点i = -2
和u = 0
。 我究竟做错了什么? 我怎么能解决这个问题?
这是因为ANSI C标准定义了只要在限定( unsigned int u
)和非限定类型( int i
)之间进行比较,非限定类型就会被提升为相同类型的类型(因此总是int
),但也inheritance了其他数量的限定符(即它变为unsigned
)。
当你的int
(其值等于-2
)因为unsigned
第一个字节经历了这个转换: 0000 0010 -> 1111 1110
。 你的int
现在是一个非常大的正数,肯定比你的unsigned int
。
有一个解决方案:施放signed
while(i < (signed) u) { // Do something i++; }
顺便说一句,可能你的编译器应该给你一个警告。
你正在比较有符号和无符号整数,你的问题从那里开始……
不要这样做,它应该工作得很好。