为什么你不能把一个FILETIME结构当成一个__int64

FILETIME结构是一个64位值,它分成了两个部分: 


typedef struct _FILETIME {


  DWORD dwLowDateTime;


  DWORD dwHighDateTime;


} FILETIME, *PFILETIME;


你可能会被迷惑,就把整个FILETIME结构作为一个__int64直接进行存取。事实上,它的内存分布同一个64位整数完成相同。下面是个例子: 


pi = (__int64*)&ft; // 错误


 


(*pi) += (__int64)num*datepart; //错误


为什么我们要说这是一个错误?


忽略了字节对齐问题。


FILETIME 是由两个DWORD组成的结构,它只需要4个字节对齐,那么这就足够把每一个DWORD对齐到一个有效的DWORD边界。不需要把第一个DWORD去对齐到8个字节。而且事实上,你可能已经使用了一个结构,而这个结构中却没有如此对齐:WIN32_FIND_DATA结构.


typedef struct _WIN32_FIND_DATA {


    DWORD dwFileAttributes;


    FILETIME ftCreationTime;


    FILETIME ftLastAccessTime;


    FILETIME ftLastWriteTime;


    DWORD nFileSizeHigh;


    DWORD nFileSizeLow;


    DWORD dwReserved0;


    DWORD dwReserved1;


    TCHAR  cFileName[ MAX_PATH ];


    TCHAR  cAlternateFileName[ 14 ]; java触屏游戏



} WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;


通过分析,这三个FILETIME结构出现在WIN32_FIND_DATA结构开头的第4,12和第20个字节,他们已经被dwFileAttributes成员失去了8个字节对齐特性。Observe that the three FILETIME structures appear at offsets 4, 12, and 20 from the beginning of the structure. They have been thrown off 8-byte alignment by the dwFileAttributes member.


强制转换FILETIME到__int64会(在WIN32_FIND_DATA 中会)得到一个没有字节对齐指针。在需要字节对齐的框架上存取一个没有字节对齐指针会引起一个STATUS_DATATYPE_MISALIGNMENT 异常。 


就算你的平台能够自动修正这个对齐问题,你仍然会引起问题。思考:为什么LARGE_INTEGER 和 ULARGE_INTEGER结构没有这个问题?


--------------------------------------------------


那转换侩如何呢?


http://stackoverflow.com/questions/1566645/filetime-to-int64


说了一个错误的例子,我想是不是那个直接移位造成的? 因为要转成 int64 后才不会溢出嘛? 是这个道理吗,有空的网友可以试一下,我没试.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值