求助:出现 Integer OverFlow 错误,怎么办?????(50分)

  • 主题发起人 主题发起人 venda
  • 开始时间 开始时间
V

venda

Unregistered / Unconfirmed
GUEST, unregistred user!
先祝大家圣诞节快乐!!!
小弟还要加班,苦,苦,苦!

想取得硬盘分区的总容量,
但读取大的分区时,会出现 Integer OverFlow 错误!
假如去掉了编译选项里的OverFlow Checking。
得到的是错误的结果!
 
用 longword ,unsigned 32-bit,应该够大了,再不够用 int64 ,signed 64-bit ,
再不够?

??

我也不知道了!
 
把取回的值保存在int64型的变量中,不要存在integer或longint中,因为它们
不能保存超过2147483647的数据,也就是超过2G就会出错
 
刚才无聊算了一下:
1G=1073741824
longword=4294967295 (最大) = 3.999999999068677425384521484375 G
int64=9223372036854775807 (最大) = 8589934591.9999999990686774253845 G

呵呵呵,怎么也够用了!
 
var
Spc,Bps,
Nofc,Tnoc:DWord;
TotalSize:Int64;
begin
…… ……
GetDiskFreeSpace('C:/'Spc,Bps,Nofc,Tnoc);//C盘的大小已超过2G
TotalSize := Spc * Bps * Tnoc;
ShowMessage(IntToStr(TotalSize div (1024 * 1024 ))+'MB');
end;

这个代码还是不行!


 
Spc,Bps,
Nofc,Tnoc 全部改为int64试试
 
GetDiskFreeSpace这个函数是取FreeSpace的,不是分区最大值,但我试了一下也不对,
你干吗不用下面这两个函数:
DiskFree、DiskSize
 
to zw84611:
GetDiskFreeSpace 参数定义的是32位呀!
 
用DiskFree、DiskSize没错!
 
To:dirk,
其实我还想取硬盘的分区的剩余容量!
DiskSize,DiskFree我试过了,是可以的!
但这两个函数的参数要求的Byte型的。
我的本意是用GetLogicalDriveStrings函数先取得系统的可用盘符,
然后再用GetDiskFreeSpace一次得到就可以了。
现在用DiskSize,DiskFree参数还要转化,够烦的。

而且,我上面的代码哪出问题了?
真想不通!!!

 
Spc * Bps * Tnoc DWORD相乘还是DWORD
 
To:eski
可不可帮我上面的代码改一下。
还用GetDiskFreeSpace函数。
先谢谢了!
 
是不是强制转换就可以了,
TotalSize := Int64(Spc) * Int64(Bps) * Int64(Tnoc);
 
不知道,我要回家了,我觉得写个参数的转换函数肯定比搞明白这个怪问题要快、方便的
多,解决就可以了,这个问题无关紧要的。
 
呵呵呵,向上强制转换怎么可能得到更大的精度?
 
to Disk:
强制转换我试过了,应该是对的吧!
谢谢你了!

我要结贴了!呵呵!
 
多人接受答案了。
 
后退
顶部