变量 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也是一样出错,谁能告诉我到底是什么原因!怎么解决???????

解决方案 »

  1.   

    2 ^ (X - 1) X=54时候   2^53
    VB里没这么大的数字iVal要不你用double型定义吧
      

  2.   

    具体是什么错误? 是溢出吗?iVal 是什么类型?如果是 Long 类型早就溢出了。
    如果是 Double类型的,离溢出还早呢。
      

  3.   

    vb.net中Long是64位的,粗略一算也至少有19位啊,保存整数的话容量应该超过double了
      

  4.   

    http://msdn.microsoft.com/library/System.Int64
    声明
    Public Const MaxValue As Long
    该常数的值为 9,223,372,036,854,775,807;即十六进制的 0x7FFFFFFFFFFFFFFF。
      

  5.   

    但是问题是 本来设想的 这一部分跟并不会出问题的  但是偏偏就是这一位处的问题 其他的都解决了 就这一点点不完美了! iVal 的类型是 ULong 无符号 64 位整数 其他本来预备出问题的地方都没有出问题 就这一点 气死我了!人算不如天算呀!
      

  6.   

    编程\调试 环境是 Win8 64 位 + VB.NET 2012 
      

  7.   

    哪会那么怪啊。
    在它提醒这儿出错误时,你在立即窗口中,分别
    Print  iVal 
    Print  Mid(S, X, 1) * (2 ^ (X - 1))
    看值是多少!还有,楼主怎么老是不说下具体错误提示是什么???
    难道这也是秘密吗!!!!!
    本身你说的这个“错误”,已经是很奇怪的事了,还要让我们想破脑袋去猜么!!!!!
      

  8.   

    我所说的错误是指 只要 X 的 值 大于 54 ,iVal 的值就和正确值不相同 具体的值 我是通过系统自带的计算器 得到的
      

  9.   

    楼主的问题搞定没?
    我倒是想到了两个方法可以来解决这个问题:一个是用“查表法”,另一个是用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这样的转换结果应该不会出错了。
      

  10.   

    iVal += iBitTab(X)
    也许应该用: iVal = iVal Or iBitTab(X)
    如果第64位(符号位)为1时,能用  + 运算,那就用 Or 吧。
      

  11.   

    iVal = 0
    For X As Integer = 1 To UBound(S)
      iVal = iVal * 2
      If Mid(S, X, 1) = 1 Then iVal = iVal + 1
    Next X
      

  12.   

    那怎么理解 Or 和 + 的区别呢 我只理解了 Or 在位运算中的的意义。
    例如 
    True Or False 返回 True: 
    False Or False 返回 False: 
    True Or True 返回 True
    但是 Or 在数学运算中的信息 我一直没弄明白
      

  13.   

    如果 Or 、And 等运算的两边都是“整数类”的常数或变量,它就对这两个操作数进行二进制位的“位运算”(每一位都要进行操作),但 + 是数学运算,是要管符号位、进位等相关操作的。位运算就没这些问题。
    比如: 1 or 3 =3,但 1 + 3 就是等于4了。
    还有(假设16位有符号整数吧) &H3000 or &HF000 = &HF000
                但: &H3000 +  &HF000 = &H2000