变量 S 保存的是及时生成的 2 进制字符串
For X as Integer = 1 to UBound(S)
iVal = iVal + Mid(S, X, 1) * (2 ^ (X - 1))
Next
我用一步步跟踪调试的方法发现只要 X 大于 54 iVal 就出错!即便是我用64个1也是一样出错,谁能告诉我到底是什么原因!怎么解决???????
For X as Integer = 1 to UBound(S)
iVal = iVal + Mid(S, X, 1) * (2 ^ (X - 1))
Next
我用一步步跟踪调试的方法发现只要 X 大于 54 iVal 就出错!即便是我用64个1也是一样出错,谁能告诉我到底是什么原因!怎么解决???????
VB里没这么大的数字iVal要不你用double型定义吧
如果是 Double类型的,离溢出还早呢。
声明
Public Const MaxValue As Long
该常数的值为 9,223,372,036,854,775,807;即十六进制的 0x7FFFFFFFFFFFFFFF。
在它提醒这儿出错误时,你在立即窗口中,分别
Print iVal
Print Mid(S, X, 1) * (2 ^ (X - 1))
看值是多少!还有,楼主怎么老是不说下具体错误提示是什么???
难道这也是秘密吗!!!!!
本身你说的这个“错误”,已经是很奇怪的事了,还要让我们想破脑袋去猜么!!!!!
我倒是想到了两个方法可以来解决这个问题:一个是用“查表法”,另一个是用16进制串作为“中转”,再用Clng函数转成数值。先说下查表法吧(下面的“代码”只是表达一下意思,我没安装 .NET ,不正确的地方你自己改啦 ^_^):
我看你的下标好象是从1开始的,那这个表也从1开始,好跟你的二进制字符串数组对应。
iBitTab( 1 to 64 ) as long 先初始化:
dim iTmp as long
iTmp = 1
For X as Integer = 1 to 63 '也许只能到62吧,你运行看结果
iBitTab(X) = iTmp
iTmp = iTmp * 2
Next
iBitTab(63) = &H4000000000000000 如果前面只能到62,就加上这句
iBitTab(64) = &H8000000000000000然后是转换数值的过程:
iVal = 0
For X as Integer = 1 to UBound(S)
if (S(X) == "1") then iVal += iBitTab(X)
Next这样的转换结果应该不会出错了。
也许应该用: iVal = iVal Or iBitTab(X)
如果第64位(符号位)为1时,能用 + 运算,那就用 Or 吧。
For X As Integer = 1 To UBound(S)
iVal = iVal * 2
If Mid(S, X, 1) = 1 Then iVal = iVal + 1
Next X
例如
True Or False 返回 True:
False Or False 返回 False:
True Or True 返回 True
但是 Or 在数学运算中的信息 我一直没弄明白
比如: 1 or 3 =3,但 1 + 3 就是等于4了。
还有(假设16位有符号整数吧) &H3000 or &HF000 = &HF000
但: &H3000 + &HF000 = &H2000