vb 溢出的问题
DimaAsLonga=VScroll1.value*100Picture1.Top=-a为什么这段代码在数值到-32,768就提示溢出了?...
Dim a As Long
a = VScroll1.value * 100
Picture1.Top = -a
为什么这段代码在数值到-32,768就提示溢出了? 展开
a = VScroll1.value * 100
Picture1.Top = -a
为什么这段代码在数值到-32,768就提示溢出了? 展开
1个回答
展开全部
VB进行加减乘除四则运算时,会根据第一步运算时的位数来决定最终结果的存储位数。这个跟最终赋值的那个变量是什么类型是无关的,因为这是发生在运算过程中(也就是赋值之前)的。
所以
16384 * 4 * 0.5
由于16384是Integer,所以VB会先假定运算结果也是Integer,因此它就分配两个字节的内存空间来存储运算结果,然后它开始运算16384 * 4,结果为65536,超出Integer的范围了,它就立刻报“溢出”,后面的也不再计算了。16384 * 2 和 2*16384 也是同样的道理,都是因为计算结果超出Integer范围所以提示“溢出”。
4 * 0.5 * 16384
同样4也是Integer,所以VB也是预定了两个字节的“座位”恭候运算结果。但是,当运算到4 * 0.5时,由于涉及到浮点运算了,所以VB就自动把运算结果的类型调整为Double,也就是说“座位”一下子扩大为8个字节了,后面再怎么运算也不会溢出了。
要想让 16384 * 4 * 0.5 不会出现溢出的错误,可以这样:
16384& * 4 * 0.5 '把16384强制指定为Long型(4个字节),这样再计算就不会溢出了
或
16384 * 4.0 * 0.5 '别以为4和4.0是一样的哦,前者是整数,后者可是浮点数哦。当然VB会自动把4.0改为4#,意思就是Double
希望能解决您的问题。
所以
16384 * 4 * 0.5
由于16384是Integer,所以VB会先假定运算结果也是Integer,因此它就分配两个字节的内存空间来存储运算结果,然后它开始运算16384 * 4,结果为65536,超出Integer的范围了,它就立刻报“溢出”,后面的也不再计算了。16384 * 2 和 2*16384 也是同样的道理,都是因为计算结果超出Integer范围所以提示“溢出”。
4 * 0.5 * 16384
同样4也是Integer,所以VB也是预定了两个字节的“座位”恭候运算结果。但是,当运算到4 * 0.5时,由于涉及到浮点运算了,所以VB就自动把运算结果的类型调整为Double,也就是说“座位”一下子扩大为8个字节了,后面再怎么运算也不会溢出了。
要想让 16384 * 4 * 0.5 不会出现溢出的错误,可以这样:
16384& * 4 * 0.5 '把16384强制指定为Long型(4个字节),这样再计算就不会溢出了
或
16384 * 4.0 * 0.5 '别以为4和4.0是一样的哦,前者是整数,后者可是浮点数哦。当然VB会自动把4.0改为4#,意思就是Double
希望能解决您的问题。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询