送分100分:几个BYTE数相加赋值给一个LONG型变量为什么会溢出

tiedaoxingui 2010-12-10 01:57:14
DIM A AS BYTE,B AS BYTE ,C AS BYTE,D AS LONG

A=251
B=252
C=253
D=A+B+C

运行到D=A+B+C,提示溢出,这是怎么回事,D可是LONG型呀,怎么会溢出呢。

...全文
283 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
gtttttttttt 2010-12-13
  • 打赏
  • 举报
回复
Private Sub Command1_Click()
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Long
A = 251
B = 252
C = 253
D = D + A + B + C
End Sub

加的时候结果时缓存在A的,A缓存不够,所以溢出.
PctGL 2010-12-12
  • 打赏
  • 举报
回复
clng 为正解。

d =a+b+c 将被解释为字节a,b,c值相加后转换为 d 的数据类型long,a+b+c相加超出字节型数据最大值导致溢出

d =clng(a)+b+c ,此时的a,b,c将会全部强制转换为long型之后再相加
熊孩子开学喽 2010-12-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 tiedaoxingui 的回复:]
DIM A AS BYTE,B AS BYTE ,C AS BYTE,D AS LONG

A=251
B=252
C=253
D=A+B+C

运行到D=A+B+C,提示溢出,这是怎么回事,D可是LONG型呀,怎么会溢出呢。
[/Quote]

虽然你写的是D=A+B+C, 但实际上在计算机内部依然是要一个数一个数相加的, 最后的结果被存放到D里面
因此在之前A和B,或者B和C相加的时候就已经溢出了. 因为无论是A+B还是B+C两个操作数均为BYTE型,系统存放单步计算结果所创建的临时变量也就是BYTE型的,就溢出了
这样的问题很容易在长计算表达式内发生,楼主要注意.
無_1024 2010-12-11
  • 打赏
  • 举报
回复
你在加法是就强制转换为LONG执行 这样就不会溢出了
king06 2010-12-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zzhgb 的回复:]
byte+byte的结果还是byte,所以溢出,
要么赋给long再加,要么用val,val返回的是double

因为double+byte返回的是double;所以上边的这样写就行了

VB code

D = Val(A) + B + C
[/Quote]
这个就已经很明了了
chinaboyzyq 2010-12-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 tiedaoxingui 的回复:]
DIM A AS BYTE,B AS BYTE ,C AS BYTE,D AS LONG

A=251
B=252
C=253
D=A+B+C

运行到D=A+B+C,提示溢出,这是怎么回事,D可是LONG型呀,怎么会溢出呢。
[/Quote]
是VB开的累加器溢出,而不是你的D溢出,VB开的累加器以表达式等号右边的变量最大值为累加器的最大值,
你右边最大变量也就是字节变量,也就是大于255就溢出,所以至少要强制转换其一到整型才正确。

d=cint(a)+b+c
tiedaoxingui 2010-12-10
  • 打赏
  • 举报
回复
在D=A+B+C的过程中,

我们先来看 A+B 溢出了, 结果是存给A了还是存给B了,还是有个BYTE型的临时变量存放此结果,到底是谁溢出了。



zdingyun 2010-12-10
  • 打赏
  • 举报
回复
Private Sub Command1_Click()
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Long
A = 251
B = 252
C = 253
D = D + A + B + C
Debug.Print D
End Sub
zdingyun 2010-12-10
  • 打赏
  • 举报
回复
Private Sub Command1_Click()
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Long
A = 251
B = 252
C = 253
D = CLng(A) + B + C
Debug.Print D
End Sub
赵4老师 2010-12-10
  • 打赏
  • 举报
回复
D=CLng(A)+CLng(B)+CLng(C)
hddz123 2010-12-10
  • 打赏
  • 举报
回复
回答的人真多啊
神马都能聊 2010-12-10
  • 打赏
  • 举报
回复
A+B+C 的类型是byte。

在 D = A+B+C 赋值的时候,才发生类型转换,即 D = (LONG)(A+B+C),而表达式A+B+C的类型是byte,在算A+B+C的时候就溢出了。
贝隆 2010-12-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lxq19851204 的回复:]
byte进行加减时是按int类型进行的,所以它们相加的结果是int型,赋值给byte型的c肯定出现类型不符合,需要转型。。。。。。。。

VB code
Dim A As Byte, B As Byte, C As Byte, D As Long

A = 251
B = 252
C = 253
D = CLng(A) + CLng(……
[/Quote]
+1
lsh6688 2010-12-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zzhgb 的回复:]
byte+byte的结果还是byte,所以溢出,
要么赋给long再加,要么用val,val返回的是double

因为double+byte返回的是double;所以上边的这样写就行了

VB code

D = Val(A) + B + C
[/Quote]+1
lxq19851204 2010-12-10
  • 打赏
  • 举报
回复
byte进行加减时是按int类型进行的,所以它们相加的结果是int型,赋值给byte型的c肯定出现类型不符合,需要转型。。。。。。。。
    Dim A As Byte, B As Byte, C As Byte, D As Long

A = 251
B = 252
C = 253
D = CLng(A) + CLng(B) + CLng(C)
qwe2854202 2010-12-10
  • 打赏
  • 举报
回复
Byte的取值上限为255,而当值超过255时,就会溢出
li163 2010-12-10
  • 打赏
  • 举报
回复

Private Sub Command1_Click()
Dim A As Byte, B As Byte, C As Byte, D As Long

A = 251
B = 252
C = 253
D = CLng(A) + CLng(B) + CLng(C)
Debug.Print D
End Sub
zzhgb 2010-12-10
  • 打赏
  • 举报
回复
byte+byte的结果还是byte,所以溢出,
要么赋给long再加,要么用val,val返回的是double

因为double+byte返回的是double;所以上边的这样写就行了

D = Val(A) + B + C
li163 2010-12-10
  • 打赏
  • 举报
回复
Byte的取值上限为255,而当值超过255时,就会溢出。
li163 2010-12-10
  • 打赏
  • 举报
回复
Private Sub Command1_Click()
Dim A As Byte, B As Byte, C As Byte, D As Long

A = 251
B = 252
C = 253
D = Val(A) + Val(B) + Val(C)

End Sub
加载更多回复(1)

1,502

社区成员

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

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