首页
社区
课程
招聘
[求助]写一个注册机时,遇到了问题?
发表于: 2005-2-27 10:38 4481

[求助]写一个注册机时,遇到了问题?

2005-2-27 10:38
4481
016A1103   |>  0FBE1C39          /movsx ebx,byte ptr ds:[ecx+edi] //取得ASCII 字符串 "SALEKING"的首字符
016A1107   |.  0FAFD3            |imul edx,ebx   //edx初始值为“1”,即ASCII 字符串的所有乘积,结果EDX
016A110A   |.  41                |inc ecx        //字符串计数器加“1”
016A110B   |.  3BCE              |cmp ecx,esi    //跟字符串长度相比较。
016A110D   |.^ 7C F4             \jl short ENCODE.016A1103 //小于就跳转。
  //本来结果为30C2C805DD3B8,但它只取了后八位,最终的结果EDX=805DD3B8

以上代码我用VB6.0 函数表述如下:

'*****************字符累乘器函数**************************
My_Str="SALEKING"
Function Str_Imul(My_Str As String) As Long
Dim i As Integer
Dim l As Integer
Dim D As Long
D = 1
l = Len(My_Str)
For i = 1 To l
D = D * Asc(Mid(My_Str, i, 1))
Next
Str_Imul = D
End Function
**********************************************************

因结果为30C2C805DD3B8(十六进制)=857810201859000(十进制)超出VB 的Long数值范围,出现溢出错误.

请问高手怎么解决?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 238
活跃值: (250)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
2
D应该是Integer吧
肯定回超出Integer的取值范围,但在VB中我不清楚该怎样做,你加上容错语句试试
2005-2-27 11:08
0
雪    币: 214
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
用C来写就成了
2005-2-27 11:46
0
雪    币: 671
活跃值: (723)
能力值: ( LV9,RANK:1060 )
在线值:
发帖
回帖
粉丝
4
前一些时我也遇到这个问题
如果还想要windows程序的界面的话
用delphi也不错哦
他可是支持int64的
C++我快放弃了,太难
2005-2-27 18:46
0
雪    币: 238
活跃值: (250)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
算我没说-_-
晕!我以为Integer的取值范围就是Int32的取值范围,原来VB里long的
取值是-2,147,483,648到2,147,483,647
我也是这个星期三才无意发现的,晕死!!
2005-3-5 13:28
0
雪    币: 204
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
参考一下大数计数器的源码吧,应该有帮助。
2005-3-5 15:53
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
最初由 东方弘 发布
参考一下大数计数器的源码吧,应该有帮助。


兄弟能贴一个大数计数器的源码上来吗?
2005-3-6 16:40
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
简单的解决方法: VC(或CB,delphi) + 内嵌汇编
2005-3-6 18:07
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
9
[转]使用VB进行整数n的阶乘。
  整数n的阶乘指 1*2*3*...*(n-1)*n 的值,在n=171时,计算机一般会出错(“溢出”),本文采用字符串模拟数字乘法运算,使计算10000!成为可能:

Function multi(ByVal X As String, ByVal Y As String) As String ''multi of two huge hexnum(两个大数之积)
Dim result As Variant
Dim xl As Long, yl As Long, temp As Long, i As Long
xl = Len(Trim(X))
yl = Len(Trim(Y))

ReDim result(1 To xl + yl)
For i = 1 To xl
For temp = 1 To yl
result(i + temp) = result(i + temp) + Val(Mid(X, i, 1)) * Val(Mid(Y, temp, 1))
Next
Next

For i = xl + yl To 2 Step -1
temp = result(i) \ 10
result(i) = result(i) Mod 10
result(i - 1) = result(i - 1) + temp
Next

If result(1) = "0" Then result(1) = ""
multi = Join(result, "")
Erase result

End Function
2005-3-6 22:59
0
雪    币: 204
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
大半年前我在网上见过那个源码,现在已经搜索不到了。我给你一个方法可以暂时解决你的数值问题,采取一些技巧的话还可以把你的字符串增长一位。位数再多的话请参考一下楼上的吧。顺便说一下,Currency用8个字节表示,可以提供二进制63位精度,最高位64是符号位,对VB来说,是最高的精度了。

My_Str="SALEKING"
Function Str_Imul(My_Str As String) As Currency
Dim i As Integer
Dim l As Integer
Dim D As Currency
D = 1
l = Len(My_Str)
For i = 1 To l
D = D * Asc(Mid(My_Str, i, 1))
Next
Str_Imul = D
End Function
2005-3-8 14:11
0
雪    币: 671
活跃值: (723)
能力值: ( LV9,RANK:1060 )
在线值:
发帖
回帖
粉丝
11
坐坐、看看、再学学
2005-3-8 23:41
0
游客
登录 | 注册 方可回帖
返回
//