其他语言

本类阅读TOP10

·基于Solaris 开发环境的整体构思
·使用AutoMake轻松生成Makefile
·BCB数据库图像保存技术
·GNU中的Makefile
·射频芯片nRF401天线设计的分析
·iframe 的自适应高度
·BCB之Socket通信
·软件企业如何实施CMM
·入门系列--OpenGL最简单的入门
·WIN95中日志钩子(JournalRecord Hook)的使用

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
类型不匹配引发的一个issue

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

 VS 2003.net


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

 

LARGE_INTEGER lnFilePos.QuadPart = 0x00 - dwRead;

SetFilePointerEx(…);

 

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

我们看一下汇编代码:

 

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

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

 

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

其中sbb 0, 0产生0xffffffff

 

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

LARGE_INTEGER lnFilePos.QuadPart = 0x00 - 0x400

vc可以正确处理。

 

 




相关文章

相关软件