VB.NET OverflowException对非常小的操作
我正在尝试合并2种颜色,为此我创建了一个非常简单的函数:VB.NET OverflowException对非常小的操作,vb.net,overflowexception,Vb.net,Overflowexception,我正在尝试合并2种颜色,为此我创建了一个非常简单的函数: Public Function MixColors(color1 As Color, color2 As Color) As Color Dim a, r, g, b As Byte a = (color1.A + color2.A) \ 2 r = (color1.R + color2.R) \ 2 g = (color1.G + color2.G) \ 2 b = (color1.B + col
Public Function MixColors(color1 As Color, color2 As Color) As Color
Dim a, r, g, b As Byte
a = (color1.A + color2.A) \ 2
r = (color1.R + color2.R) \ 2
g = (color1.G + color2.G) \ 2
b = (color1.B + color2.B) \ 2
Return Color.FromArgb(a, r, g, b)
End Function
问题是我在第一次操作时就得到了OverflowException,我不明白为什么
我尝试先将变量的类型更改为整数,然后再更改为双精度,结果不变
我还尝试从\运算符切换到/one,但仍然没有更改
变量的类型(color.A)是否会影响执行?正如Hans已经评论的那样,如果添加两个字节(如
color1.A+color1.B
),则会得到一个最大值为255的字节。您必须将其强制转换为Int32
,例如使用CInt
。无论如何都需要4个整数。因此,应采取以下措施:
Dim a, r, g, b As Int32
a = (CInt(color1.A) + CInt(color2.A)) \ 2
r = (CInt(color1.R) + CInt(color2.R)) \ 2
g = (CInt(color1.G) + CInt(color2.G)) \ 2
b = (CInt(color1.B) + CInt(color2.B)) \ 2
Return Color.FromArgb(a, r, g, b)
对于.NET语言来说,VB.NET有点不寻常,添加2个字节会生成一个字节结果,而不是整数。因此,溢出的不是分配,而是添加。使用CInt()强制整数加法,如a=CByte((CInt(color1.a)+color2.a)\2)。CByte是保持happy选项严格的必要条件。是的,谢谢,我尝试用Int变量而不是第一个颜色来更改函数,结果成功了,所以我怀疑正如您所解释的那样。感谢您的澄清:)