为什么会造成溢出

justgod 2005-03-12 10:57:43
Public count1 As Long
Dim buf_redata() As Byte

count1 = buf_redata(1) * 256 + buf_redata(2)

为什么会造成溢出,
然而把程序改为下面,溢出好像就没了。


count1 = buf_redata(1)
count1 = count1 * 256
count1 = count1 + buf_redata(2)
...全文
60 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
viena 2005-03-12
  • 打赏
  • 举报
回复
以上From MSDN,结果是这样的没错,但关于精确度的说法是不对的

浮点数表数范围大,但精确度不高的
实际上,Single没有Long精确度高,Double没有Currency精确度高
justgod 2005-03-12
  • 打赏
  • 举报
回复
谢谢!!viena(维也纳nn-实心木头人)
justgod 2005-03-12
  • 打赏
  • 举报
回复
哦,谢谢!明白了,其实我也想到这点,我才把程序写成那种方式;
count1 = buf_redata(1)
count1 = count1 * 256
count1 = count1 + buf_redata(2)

但是这样写不是好繁琐吗?
在C里面可以写成以下这样解决问题,
count1 = (ulong)(buf_redata[1] * 256) + buf_redata[2];

VB应该怎么写成一个语句解决问题呢?
viena 2005-03-12
  • 打赏
  • 举报
回复
乘法与加法运算结果的数据类型通常与最精确的表达式的数据类型相同。精确度由最低到最高的顺序是
Byte、 Integer、Long、Single、Currency、Double 和 Decimal
viena 2005-03-12
  • 打赏
  • 举报
回复
改为
count1 = buf_redata(1) * 256& + buf_redata(2)
就可以了,&是Long型类型声明符,此时256为Long型,表达式也为Long型,就不会溢出了
viena 2005-03-12
  • 打赏
  • 举报
回复
哦,错了,汗!
有256,表达式应该是Integer类型
buf_redata(1) * 256 + buf_redata(2)运算的结果超出了Integer的范围
viena 2005-03-12
  • 打赏
  • 举报
回复
buf_redata(1) * 256 + buf_redata(2)
这个表达式是Byte型,在给Long型变量count1赋值以前,存放在一个Byte型临时变量里,超出了Byte的范围,当然会溢出

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧