这个负数是怎么来的?

kooko1986 2011-01-10 05:24:31
下载一个文件的时候,想让它边下载边显示一个进度.即下载了百分之多少.

我在接收的Socket接收到文件后,让它与总文件长度进行比较,然后设置Edit的显示值.

但是显示的时候不是从0%到100%.最大只到了30多点,然后就变成负的,-30左右,然后一直减到0,再增加到30左右,然后完毕..

long igDownLoadTotalFileLens; //总共需要下载的文件总长度
long igHaveDownFileLens; //当前已经下载的文件长度
long igFileDownBiLi; //下载的文件占总的百分比
char strFileDownBiLi[255];; //文件下载百分比

下面是显示的几步..
igFileDownBiLi = igHaveDownFileLens*100/igDownLoadTotalFileLens; //已下载文件比例
itoa(igFileDownBiLi, strFileDownBiLi, 10);
strcat(strFileDownBiLi,"%");
m_tempDlg->GetDlgItem(IDC_EDITSTATUS)->SetWindowText(strFileDownBiLi);

比如文件是64M,跟的时候下载文件长度到总文件长度3分之1左右的时候,strFileDownBiLi就会第一位成负号了.

这个是因为什么呢?
...全文
124 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
kooko1986 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 happyparrot 的回复:]
因为你的程序有溢出的情况。
你的文件大小是64M,那么1/3就是21M左右,由于你这行代码:
igFileDownBiLi = igHaveDownFileLens*100/igDownLoadTotalFileLens
中,先将一个long类型乘以100,这将导致溢出!因为乘以100后,21M就变成了2100M,而long型的最大值为
2147483647,即2100M左右,所以就变成了……
[/Quote]

恩,的确是.谢谢了
快乐鹦鹉 2011-01-10
  • 打赏
  • 举报
回复
因为你的程序有溢出的情况。
你的文件大小是64M,那么1/3就是21M左右,由于你这行代码:
igFileDownBiLi = igHaveDownFileLens*100/igDownLoadTotalFileLens
中,先将一个long类型乘以100,这将导致溢出!因为乘以100后,21M就变成了2100M,而long型的最大值为
2147483647,即2100M左右,所以就变成了负数。
解决办法,将此句修改为:
igFileDownBiLi = igHaveDownFileLens*1.0/igDownLoadTotalFileLens*100;这样可以避免溢出发生
bragi523 2011-01-10
  • 打赏
  • 举报
回复
单步走一下,看看各个变量的值

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧