epespad

Conversión en Visual Bacic .net

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

Comentarios Destacados

MATONRAH +6

le doy
esbrije +3
@Marty_F Te fijaste en todo menos en su trasero virgo taringuero je je.Saludos.
Marty_F
@esbrije es que no vi ni la palangana donde se lo lava, por eso no me tentó, las mujeres que conozco tienen videt. Ni virgo ni taringuero, ojalá, tengo mas cascotazos que una lechuza. un abrazo.
tarantinezco
Yo primero, lo pienso
De ahí le doy

22 comentarios - Modem nuevo? Mirate estas imagenes de humor papa (4)

xjota
algunos muy buenos!
tekki -1
¿Porqué siempre ponés fotos de minas o culos en las miniaturas de tus posts si después el 90% de las imágenes no son de ese estilo ? Pará un poco con los baits vieja.
Funky_Dung
en 3 post de 60 que he posteado esta semana hay culos
vos comes pichon
tekki
@Funky_Dung Ya se que son baits, sos un posteador común, pero para la mano jajaja. Por cierto puse "minas o culos". Saludos master.
entropico
aprendiste la palabra bait ayer ya nos dimos cuenta segui con tu miserable vida pero habla como normal
Mr_Meeseeks
no entendi lo del modem
Funky_Dung
que son imagenes viejas, es una jerga de la v4 cuando posteabas post de noticias viejas
Guille_francella +2
No entendi
Ulixe +3
Thanks en ingles es "gracias". Thanks a lot, "muchas gracias"
A lot of T. Hanks, un montón de Tom Hanks.
Guille_francella
@Ulixe gracias kpo
d_i_e_g_o_64
Modem nuevo? Mirate estas imagenes de humor papa (4)
La frase posta debería haber sido
"no tenemos wifi porque somos unos ratas, hablen entre ustedes"
DubiDudubi
y que mierda tiene que ver lo del modem nuevo?

pd: una cagada el post
Funky_Dung
sos nuevo en taringa? en la v4 se le decia asi cuando eran imagenes viejas
como todas las del post
TensaSangetsu
Modem nuevo? Mirate estas imagenes de humor papa (4)
Una vez un compañero de la universidad que tenía el proyecto (un circuito electrónico) no se apareció el día que había que entregarlo, no contestaba su telefono, ni mensaje nada y no sabia donde vivia, se fue aparecio una semana después de que terminara el ciclo y para decirme que no le había salido el trabajo, se lo había dado casi hecho al muy HDP, afortunadamente mis demás notas estaban bien y el profesor aplico curva (redujo la nota mínima aprobatoria) y pase, lo más triste es que al siguiente ciclo se me olvidó y volví a hacer grupo con él, afortunadamente esa vez me salvo en el curso así que quedamos a mano.