打开Win7系统的计算器,切换到“程序员”模式,你会发现数字显示区域下面多了这样一堆东西:(截图是macOS的计算器,我现在没有Win7所以用这个代替了
)
这就是数字用二进制表示的形式,这是在“四字”模式下,共有8个字节即64个二进制位,也正是Currency类型所占的内存大小;不过,这只能表示Currency型变量在内存中的存储值,它在VB中所表示的数值是实际内存值的万分之一(这是VB规定的,就是为了让Currency能表示小数;实际上,Currency与Integer、Long这些类型一样,都是定点数,只不过Integer等整数类型的小数点在最右边【所以是整数】,而Currency的小数点右边固定有4位数字【称为定点小数】)
如果把计算器的位数模式切换成“双字”或“字”,那么对应的就是Long型或Integer型,并且同时对应了它们在VB中表示的数值和实际的内存值(因为两者是一致的,如上所述)
现在(四字模式下),在计算器中输入一个介于2^31~2^32-1(2147483648~4294967295)之间的数字,你就会看到,这个区域中的31所对应的位是1,而上面一行则全是0;然后切换到“双字”,上面一行0就全部消失了,同时输入的数字变成了负数!没错,VB的For循环就对Currency干了这种事,它把这个范围内的Currency型数值截断成了Long型,然后把“最高位”(位31)的1当成了符号位,认为这是一个负数,然后就出bug了……