随笔-60  评论-98  文章-0  trackbacks-0
最近在处理超大文件,用到了DWORD64

期望用户将偏移量以DWORD64的形式传进来,然后我调用WindowsAPI进行定位,读取文件,返回

这是CB下的测试结果,没有报错,只给你返回一个错误的结果
1// 是测试DWORD64右移32位会出现什么状况
2DOWRD64 dw6403 = 1024*1024*1024;
3DWORD64 dw6404 = 2*1024*1024*1024;
4UINT uTmp = 6403>>32// 0
5uTmp = 6404>>32;      // oxFFFFFFFF

// CB下编译通过,结果正确
1// 目的同上
2DWORD64 dw641G = 1024*1024*1024;
3DWORD64 dw6404 = 2*dw641G ;
4UINT uTmp = dw6404>>32// 0

结论:是两家的编译器在预编译的时候,不允许数值超过1G。
posted on 2010-02-02 20:09 创建更好的解决方案 阅读(1848) 评论(9)  编辑 收藏 引用 所属分类: C++专栏内存专题

评论:
# re: Visual Studio VS C++Builder07 不同的公司,同样的Bug 2010-02-02 20:21 | 创建更好的解决方案
// 更为离谱的事情发生了,同为10*1024*1024的两个数值,由于一个是成员变量,一个是临时变量,右移之后结果居然不同

DWORD64 dw64Tmp = m_dw64FileSize;
UINT dwTmp2 = (m_dw64FileSize>>32); // 还是10*1024*1024
UINT dwTmp1 = (dw64Tmp>>32); // 0  回复  更多评论
  
# re: Visual Studio VS C++Builder07 不同的公司,同样的Bug[未登录] 2010-02-02 23:14 | clear
64位字面常量后面要加LL
否则数字按照32位,乘法使用32位,结果溢出了。

所以,这个不是编译器bug。  回复  更多评论
  
# re: Visual Studio VS C++Builder07 不同的公司,同样的Bug 2010-02-03 10:42 | coolypf
请问您懂汇编吗?  回复  更多评论
  
# re: Visual Studio VS C++Builder07 不同的公司,同样的Bug 2010-02-03 11:38 | 空明流转
Literal Constant Suffix “L”啊同学。。。  回复  更多评论
  
# re: Visual Studio VS C++Builder07 不同的公司,同样的Bug 2010-02-03 12:06 | 创建更好的解决方案
@clear
2*1024*1024*1024,距离32位溢出,还有50步呢  回复  更多评论
  
# re: Visual Studio VS C++Builder07 不同的公司,同样的Bug 2010-02-03 13:56 | 试试其他的
32位机器上整形最大是2^31 - 1。
2*1024*1024*1024 溢出了。

2LL*1024*1024*1024 才不溢出。明白?

clear 的说法是正确的。 这么点屁事别放首页。  回复  更多评论
  
# re: Visual Studio VS C++Builder07 不同的公司,同样的Bug 2010-02-03 14:38 | 创建更好的解决方案
@试试其他的
int和unsigned int表达范围一样吗?
  回复  更多评论
  
# re: Visual Studio VS C++Builder07 不同的公司,同样的Bug 2010-02-05 13:20 | 喜乐递官方网站
爱上的卡就是觉得  回复  更多评论
  
# re: Visual Studio VS C++Builder07 不同的公司,同样的Bug 2010-02-05 16:50 | 试试其他的
@创建更好的解决方案
当然不一样了。
至于int和unsigned int范围可以参见limits.h
里面有INT_MIN,INT_MAX和UINT_MAX  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理