注册 登录
编程论坛 VB6论坛

高手请进,关于Currency不进入循环的问题

沉默的痞子 发布于 2016-12-13 15:23, 3213 次点击
上代码:
程序代码:
dim i as Currency,dim j as Currency
for i=2 to 400000
j=j+1
next
print j
end sub

这里i根本不进入循环,为什么? 如果是 2 to 600000就可以
i定义成long是可以的

[此贴子已经被作者于2016-12-13 15:26编辑过]

11 回复
#2
w3609894262016-12-13 17:26
类型错了 dim i as long
#3
沉默的痞子2016-12-14 08:50
回复 2楼 w360989426
Currency 理论上也是可以的啊,它的范围比long还大
#4
风吹过b2016-12-14 10:12
我记得有一句话,但忘了是哪里说的
 Currency 是一种特殊的类型,定点小数。可能就是这个原因导致它不属于基本数据类型。

可能还有一个原因是,Currency 是 64位的,而VB6编译出来的程序是 32位的,造成 Currency 无法装入一个寄存器,而导致它不属于基本数据类型。
32位的应用,使用的寄存器,是 32位/16位/8位 三种。

不是基本数据类型,是肯定无法当做循环变量 ,如 数组元素 。

------------
数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存取,不会影响高16位的数据。这些
低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄
存器都有自己的名称,可独立存取。
#5
沉默的痞子2016-12-14 11:04
回复 4楼 风吹过b
但是为什么只有40万左右会这样,50万就不会呢
#6
沉默的痞子2016-12-14 11:04
回复 4楼 风吹过b
但是为什么只有40万左右会这样,50万就不会呢
#7
风吹过b2016-12-14 12:20
这个真是搞不懂。
很少用 Currency 数据类型,可能与内部数据处理过程有关。
二个LONG 的范围,然后又是 定点小数 。
#8
ZHRXJR2016-12-16 12:26
回复 3楼 沉默的痞子
Currency 数据类型是货币数据,而循环变量的数据必须是基本的数值数据,因此循环时程序不会识别货币这个数据,当然不会进行循环的。
基本的数值数据类型是:Byte-字节型、 Integer-整形、 Long-长整形。Single-单精度、Double-双精度 数据是实数数据,实数数据也可以作为循环变量,但一般循环使用长整形数据已经足够了,因此很少使用实数数据。
Currency 数据类型是货币数据,它主要用于表示货币的值,它与数值数据不一样,只能识别货币,而识别不了数值。
#9
沉默的痞子2016-12-16 13:14
回复 8楼 ZHRXJR
是货币型啊,我以为也是表示整数的
#10
xzlxzlxzl2016-12-16 17:30
经验证:
1,for循环使用货币性变量作为循环变量,只要差值不超过214748即可运行,及For i = 0@ To 214748@可以,For i = 0@ To 214749@即失败
2,货币性数值自加不同于整形数自加,如For i = 0@ To 214748@,最后i的值是429497
3,出现这种情况应该与货币型数据的表示特性有关,货币型数据属于定点数,自加时当做普通型数据自加出错了
4,避免使用货币型数据作为循环变量
#11
风吹过b2016-12-16 20:17
好吧,今天终于有时间也来验证一下。
先放我的验证代码:
程序代码:
Option Explicit

'二个类型的定义,Lset命令要求
Private Type CType

 a As Currency
End Type

Private Type Ltype
    a As Long
    b As Long
End Type

Private Sub Command1_Click()

Dim a As CType
Dim b As Ltype
Dim s As String
a.a = Val(Text1.Text)           '读值
LSet b = a                      '放入long
s = b.a & vbCrLf & b.b          '按10 进制显示
s = s & vbCrLf & Hex(b.a) & vbCrLf & Hex(b.b)   '按16进制显示
Text2.Text = s
End Sub


当=214748时,二个long 是 2147480000 和 0
对应十六进制数为: 7FFFF1C0 和 0

当=214749时,二个long 是-2147477296 和 0
对应十六进制数为: 800018D0 和 0

结论是:因 Currency 内部定义为无符号数,所以没有符号位。
Currency 保存的数据是 数值 * 10000 。
214749 ,乘 10000 以后,按 long 解释,变成负数的。

无符号数,定义请参考 C语言。
#12
xzlxzlxzl2016-12-17 11:17
回复 11楼 风吹过b
有些道理,但不能完全释疑!
比如题主的例子是到400000循环,经验证,只能从214749-400000循环,差值是185251,不是214748,再实验课发现又可从0-500000循环,差值就是50万了。又怎么解释在0-214748循环结束后i=429497,i+1似乎变成了i+2呢。
还是不要用货币类型做循环变量好啊!
1