经常看到类似于如下代码:function Succeeded(Res: HResult): Boolean;
begin
  Result := Res and $80000000 = 0;
end;function Failed(Res: HResult): Boolean;
begin
  Result := Res and $80000000 <> 0;
end;不明白为什么不能写成这样:
function Succeeded(Res: HResult): Boolean;
begin
  Result := Res = 0;
end;function Failed(Res: HResult): Boolean;
begin
  Result := Res <> 0;
end;明明可以直接比较,为什么非要AND一下? 谁给解释一下?

解决方案 »

  1.   

    那是 算术位and,而不是逻辑andRes and $80000000 = 0
    表示 关注 res的最高位等于0,res其它位不是0也没关系Res and $80000000 <> 0;
    表示 关注 res的最高位等于1,res其它位是不是0都没关系
      

  2.   

    主要是判断HResult的第31位是否为1还是0,如果res第31位为0的话,其它位为任何值都为成功状态,否则为失败状态
      

  3.   

    thanks, sz_haitaosorry, 是位运算明白你的意思,只是我还是不理解这样写的好处?
      

  4.   

    LZ最好看看HRESULT 类型的位定义
      

  5.   

    thanks, liangpei2008 我明白这个位运算的意思。这两个函数主要用来判断COM的返回值,一般等于0表示成功,否则表示失败,所以写成如下形式不行吗?Result := Res = 0; Result := Res <> 0; 
      

  6.   

    看了下winerror.h我想单就这两个函数而言,似乎怎么写都没什么问题,只是标准写法更能表示出HRESULT的含义,更能说明问题吧。
      

  7.   


    这样写,关注点可以更准确:某一位(其它位不管是什么都没关系)res为0x81或0x71 都满足 res<>0
    但是 res and $80 <> 0,则只有前者才满足
      

  8.   


    $71 and $80 也是 = 0的啊 :-)