【问题标题】:OverflowException when trying to sum the Bytes of two Arrays尝试对两个数组的字节求和时出现溢出异常
【发布时间】:2019-01-14 05:16:52
【问题描述】:

我正在尝试将 Array 的第二个索引和另一个 Array 的第二个索引相加,并将总和分配给 Int64 变量:

Dim value_array(60) As Byte
Dim myBytes1() As Byte = MyStringConversions.StringToByteArray(Substr_Cid) 
Dim sum As Int64

value_array(1) = &HFE
myBytes1(1) = &HFC
sum = value_array(1) + myBytes1(1)

我收到了OverflowException
我不知道为什么,Int64 可以轻松地将01FA 放入十六进制。

【问题讨论】:

  • 您很可能会收到 NullReferenceException: Dim myBytes1() As Byte => 尝试设置值时未初始化的数组。另外,请记住集合在索引 0 处初始化,VB.Net 设置上限:value_array(60) 将包含 61 个元素。
  • @Jimi 它包含值并已初始化
  • 将 myBytes1() 调暗为 Byte = MyStringConversions.StringToByteArray(Substr_Cid)

标签: arrays vb.net overflow


【解决方案1】:

您正在执行的算术运算将 Byte 值与 Byte 值相加。
然后将总和的结果分配给Long 变量类型。
分配发生在操作执行之后。

由于您将 myBytes1(1)value_array(1) 相加:

Dim sum As Int64 = value_array(1) + myBytes1(1)

value_array 的类型为Byte,总和值超出了Byte.MaxValue = 255 可以包含的值。
因此OverflowException

为避免出现异常,请将要求和的值强制转换或转换为目标类型。
由于这是widening conversion,因此不会发生溢出:

LongLong 相加:

Dim sum As Long = CType(value_array(1), Long) + CType(myBytes1(1), Long) 

或将ByteLong 相加:

Dim sum As Long = CLng(value_array(1)) + myBytes1(1)

但不是:

Dim sum As Int64 = CLng(value_array(1) + myBytes1(1))

这里,转换是在算术运算已经溢出Byte.MaxValue 之后执行的。

【讨论】:

  • 非常感谢,能否请您帮我解决如何将整数分配给字节而不溢出,我希望将整数的最后一个字节分配给字节
  • 当然,[Byte Value] = CByte([Integer Value] And &HFF)。这将AND1 低字节和AND0 其他。
猜你喜欢
  • 2014-04-30
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 2015-08-29
  • 2022-01-02
相关资源
最近更新 更多