当您尝试比较两个变量时,Microsoft C编译器会发出警告,其中一个是有符号的,另一个是无符号的.例如:
int a; unsigned b; if ( a < b ) { // warning C4018: '<' : signed/unsigned mismatch }
在世界历史上,这个警告是否曾经发现了一个真正的错误?无论如何,为什么呢?
永远不要忽略编译器警告.
哦,它有.但反过来说.有一天,忽略那个警告给我带来了巨大的麻烦.我正在编写一个绘制图形的函数,并混合有符号和无符号变量.在一个地方,我将负数与无符号数进行比较:
int32_t t; ... uint32_t ut; ... if(t < ut) { ... }
猜猜发生了什么?已签名的数字被提升为无符号类型,因此最终更大,即使它最初低于0.我花了几个小时才找到了这个bug.