忽略强制转换操作符?

  • 本文关键字:操作符 转换 c++
  • 更新时间 :
  • 英文 :


有这么简单的代码:

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被忽略了?

DWORDunsigned或等价的,在您的c++实现中是一个32位无符号整数。DWORD i = 0xFFFFFFF5;初始化i为FFFFFFF516= 4,294,967,285.

(unsigned)i == -11中,将i转换为unsigned,得到相同的值4,294,967,285。另一个操作数-11,类型为int,值为−11。

当两个数字与==比较时,它们被转换为某种共同类型。unsignedint的操作规则导致int被转换为unsigned。当−11在unsigned为32位的c++实现中转换为unsigned时,转换结果为232−11 = 4,294,967,296−11 = 4,294,967,285。

比较两个unsigned值。因为它们都是4,294,967,285,所以比较表明它们相等。

最新更新