Este es un experimento de conversión hecho en .net framework 4.8, donde se comparan distintos métodos de conversión.
Además de resolver una duda puntual, el objetivo es inspirar o motivar ir más allá de esta simple prueba.

En el mundo de la programación cualquiera sabe que una variable con el bit más alto con valor "1" corresponde a un número negativo, excepto en Microsoft.
Por ejemplo, CInt("&hFFD9CECE" debería devolver -2502962, pero termina en un desbordamiento. No se cuales son las excusas, pero solo son eso.
En C hay algo maravilloso que son las uniones, muy simple y muy eficiente para convertir valores. En Visual Basic no existe esto, pero se puede simular.
La duda es si insume más tiempo en comparación con otros métodos, y en mi prueba la diferencia fue pequeña.



La prueba consiste en convertir el valor y pasarlo a otra variable, y esto durante un segundo.
Para simular una unión, primero se debe añadir en la primera línea Imports System.Runtime.InteropServices. La estructura que funciona como unión debe comenzar con <StructLayout(LayoutKind.Explicit)>, y cada ítem debe tener indicada su posición con <FieldOffset(0)> .
El código del formulario tiene los comentarios en inglés, pues la intensión es publicarlo en otros lugares.


Imports System.Runtime.InteropServices

Public Class Form1

#Region "Object"
Dim WithEvents tmr1 As System.Timers.Timer
Dim WithEvents tmr2 As System.Timers.Timer
Dim WithEvents tmr3 As System.Timers.Timer
Dim WithEvents tmr4 As System.Timers.Timer
Dim WithEvents tmr5 As System.Timers.Timer
#End Region

#Region "Variables"
Dim Cnt As Long
#End Region

#Region "Unions"
<StructLayout(LayoutKind.Explicit)>
Public Structure Un32
<FieldOffset(0)> Dim Byte0 As Byte
<FieldOffset(1)> Dim Byte1 As Byte
<FieldOffset(2)> Dim Byte2 As Byte
<FieldOffset(3)> Dim Byte3 As Byte

<FieldOffset(0)> Dim Short0 As Int16
<FieldOffset(2)> Dim Short1 As Int16

<FieldOffset(0)> Dim uShrt0 As UInt16
<FieldOffset(2)> Dim uShrt1 As UInt16

<FieldOffset(0)> Dim Word0 As Int32

<FieldOffset(0)> Dim uWord0 As UInt32

<FieldOffset(0)> Dim Sng0 As Single
End Structure

<StructLayout(LayoutKind.Explicit)>
Public Structure Interdatos
<FieldOffset(0)> Dim Byte0 As Byte
<FieldOffset(1)> Dim Byte1 As Byte
<FieldOffset(2)> Dim Byte2 As Byte
<FieldOffset(3)> Dim Byte3 As Byte
<FieldOffset(4)> Dim Byte4 As Byte
<FieldOffset(5)> Dim Byte5 As Byte
<FieldOffset(6)> Dim Byte6 As Byte
<FieldOffset(7)> Dim Byte7 As Byte

<FieldOffset(0)> Shared B(7) As Byte

<FieldOffset(0)> Dim Short0 As Int16
<FieldOffset(2)> Dim Short1 As Int16
<FieldOffset(4)> Dim Short2 As Int16
<FieldOffset(6)> Dim Short3 As Int16

<FieldOffset(0)> Dim uShrt0 As UInt16
<FieldOffset(2)> Dim uShrt1 As UInt16
<FieldOffset(4)> Dim uShrt2 As UInt16
<FieldOffset(6)> Dim uShrt3 As UInt16

<FieldOffset(0)> Dim Word0 As Int32
<FieldOffset(4)> Dim Word1 As Int32

<FieldOffset(0)> Dim uWord0 As UInt32
<FieldOffset(4)> Dim uWord1 As UInt32

<FieldOffset(0)> Dim Sng0 As Single
<FieldOffset(4)> Dim Sng1 As Single

<FieldOffset(0)> Dim Lng As Int64
<FieldOffset(0)> Dim uLng As UInt64

<FieldOffset(0)> Dim Doble As Double
End Structure
#End Region

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
tmr1 = New Timers.Timer
tmr1.Interval = 1000
tmr1.AutoReset = False

tmr2 = New Timers.Timer
tmr2.Interval = 1000
tmr2.AutoReset = False

tmr3 = New Timers.Timer
tmr3.Interval = 1000
tmr3.AutoReset = False

tmr4 = New Timers.Timer
tmr4.Interval = 1000
tmr4.AutoReset = False

tmr5 = New Timers.Timer
tmr5.Interval = 1000
tmr5.AutoReset = False

End Sub

Private Sub cmdStart_Click(sender As Object, e As EventArgs) Handles cmdStart.Click
Dim Value As String
Dim i32 As Int32
Dim i33 As Int32
Dim ui32 As UInt32
Dim ui33 As UInt32
Dim i64 As Int64
Dim u32 As Un32
Dim u64 As Interdatos

Me.Cursor = Cursors.WaitCursor
cmdStart.Enabled = False

Value = "&hFFD9CECE"

tmr1.Start()

' Convet to unsigned integer
Cnt = 0
While tmr1.Enabled
u32.uWord0 = CUInt(Value)
i32 = u32.Word0
Cnt += 1
End While
lbU32.Text = Cnt.ToString
lbU32.Update()

' Convert through a short union
Cnt = 0
tmr2.Start()
While tmr2.Enabled
u64.uWord0 = CUInt(Value)
i32 = u64.Word0
Cnt += 1
End While
lbU64.Text = Cnt.ToString
lbU64.Update()

' Convert through a long union
Cnt = 0
tmr3.Start()
While tmr3.Enabled
ui32 = CUInt(Value)
ui33 = ui32
Cnt += 1
End While
lbCUInt32.Text = Cnt.ToString
lbCUInt32.Update()

' Convert Val()
Cnt = 0
tmr4.Start()
While tmr4.Enabled
i32 = CInt(Val(Value))
i33 = i32
Cnt += 1
End While
lbVal.Text = Cnt.ToString
lbVal.Update()

' Convert implicit
Cnt = 0
tmr5.Start()
While tmr5.Enabled
ui32 = Value
ui33 = ui32
Cnt += 1
End While
lbImpl.Text = Cnt.ToString
lbImpl.Update()

Me.Cursor = Cursors.Default
cmdStart.Enabled = True
End Sub
End Class