有这么简单的代码:
DWORD i = 0xFFFFFFF5; // == 4294967285(signed) == -11(unsigned)
if((unsigned)i == -11)
OutputDebugString(L"equal");
else
OutputDebugString(L"not equal");
条件是满足- i'm getting "equal"输出。
我的问题是为什么会发生这种情况,因为在我们的条件f(4294967285 == -11)
考虑到显式的unsigned
在操作符的左侧?为什么cast被忽略了?
DWORD
是unsigned
或等价的,在您的c++实现中是一个32位无符号整数。DWORD i = 0xFFFFFFF5;
初始化i
为FFFFFFF516= 4,294,967,285.
在(unsigned)i == -11
中,将i
转换为unsigned
,得到相同的值4,294,967,285。另一个操作数-11
,类型为int
,值为−11。
当两个数字与==
比较时,它们被转换为某种共同类型。unsigned
和int
的操作规则导致int
被转换为unsigned
。当−11在unsigned
为32位的c++实现中转换为unsigned
时,转换结果为232−11 = 4,294,967,296−11 = 4,294,967,285。
比较两个unsigned
值。因为它们都是4,294,967,285,所以比较表明它们相等。