今天碰到一个问题,以为是bug,后来才发现不是bug。只是代码写的傻X而已。
-
#define erroe -1
-
-
-
int func()
-
{
-
return -1;
-
}
-
int main()
-
{
-
unsigned int b = func();
-
if(error == b)
-
{
-
//觉得永远不会执行,是bug。其实不是bug。这里的代码照样可以执行
-
}
-
}
如果编译时,加上适当的编译选项,会出现warning :
comparison between signed and unsigned。
为什么会执行 ?b难道不是永远不可能为负数吗?
非也。
理解1:“
==”的右值会非显示的转成左值类型。
理解2:signed / unsined 是程序员可见的,程序员的思维限制的一种形式。而对于内存,对于cpu,就是一个东西,一堆4字节大小的二进制数
signed int a = B 1111 1111;
unsigned int b = (unsigned int )a 只是告诉编译器,把a最高位当成符号位,也就是程序员麻痹自己说,两者不一样,但是对于内存而言,两者都是8个1。
阅读(1914) | 评论(0) | 转发(1) |