类型不匹配引发的一个issue

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

VS 2003.net

在使用SetFilePointerEx设置文件位置的时候,需要使用到LONGLONG类型,然后在读一段dwRead长的数据之后,需要把文件位置复位:

LARGE_INTEGER lnFilePos.QuadPart = 0x00 - dwRead;

SetFilePointerEx(…);

问题就出现了,这段代码是有问题的。因为0x00 - dwRead对lnFilePos.QuadPart来说并不是一个负数。

我们看一下汇编代码:

关键在mov dword ptr [lnFilePosition], eax上,它是直接写入内存,而高位ecx简单的为0,没有进行任何的扩展。在内存中,lnFilePostion占8个字节,写入后就是这样:

所以当再次引用lnFilePostion的时候,lnFilePostion = 00000000 fffffc00,而不是期望的ffffffff fffffc00。

下面是添加类型转换后的汇编代码(虽然是在Debug下,但VC2003.net生成的汇编代码实在有点拙劣)。

其中sbb 0, 0产生0xffffffff。

不过这种情况只在表达式包含变量的时候存在,如果两个立即数,比如:

LARGE_INTEGER lnFilePos.QuadPart = 0x00 - 0x400;

vc可以正确处理。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航