Empequtar dos Short en un Int y viceversa

28/05/2004 - 16:41 por Gandalf | Informe spam
Pues lo dicho, como puedo empaquetar dos variables Short (Int16) en una Int
(Int32) y luego volver a obtener los valores iniciales.

Un Saludo y Gracias.

Preguntas similare

Leer las respuestas

#6 Octavio Hernandez
29/05/2004 - 11:52 | Informe spam
Gandalf,

¿No pierdes el signo del segundo número al hacer val = (((long)hi) << 32) |
((uint)lo) ?

Saludos,

Octavio

"Gandalf" escribió en el mensaje
news:
Empaquetor dos int en un long y viceversa:
int hi = -5;

int lo = -6;

//long val = (((long)hi) << 32) | lo; // Warning: CS0675

long val = (((long)hi) << 32) | ((uint)lo); // correct

hi=(int)(val>>32);

lo=(int)(val & 0xffffffff);

Empaquetar dos short en un int y viceversa:

short a=-20,b=-6;

int i = (((int)a)<<16) | ((ushort)b);

a = (short)(i>>16);

b = (short)(i & 0xffff);

Point pt=new Point(i); //otra forma de obtener los valores: pt.x==-6 y
pt.y==-20

Un Saludete



"Gandalf" escribió en el mensaje
news:
> Pues lo dicho, como puedo empaquetar dos variables Short (Int16) en una
Int
> (Int32) y luego volver a obtener los valores iniciales.
>
> Un Saludo y Gracias.
>
>


Respuesta Responder a este mensaje
#7 Gandalf
31/05/2004 - 12:06 | Informe spam
No, no se pierde. Al hacer la conversión explicita a (uint) se hace bit a
bit y por tanto se conserva el bit de signo.

Prueba a hacer:

int num=-1;
uint num2=(uint)num;

y veras como en num2 no hay un 1, sino un 4294967295 o sea FFFFFFFF en
hexadicimal, lo mismo que en num1.

O más claro todavía haz:

Console.WriteLine("{0:x}",num1);

Console.WriteLine("{0:x}",num2);

Un Saludo.
Respuesta Responder a este mensaje
#8 Octavio Hernandez
01/06/2004 - 00:06 | Informe spam
Gandalf,

Ya he encontrado lo que me hacía sospechar.
Ese código te funciona porque por defecto los proyectos de C# se compilan
con la opción del compilador /checked desactivada. Si pones la opción en
true (en Propiedades del Proyecto | Configuración | Generar), se producirá
una excepción al ejecutar la segunda línea de:

int num = -1;
uint num2 = (uint) num;

Lo correcto para que siempre funcione es:
int num = -1;

uint num2;

unchecked

{

num2 = (uint) num;

}


Salu2 - Octavio



"Gandalf" escribió en el mensaje
news:
No, no se pierde. Al hacer la conversión explicita a (uint) se hace bit a
bit y por tanto se conserva el bit de signo.

Prueba a hacer:

int num=-1;
uint num2=(uint)num;

y veras como en num2 no hay un 1, sino un 4294967295 o sea FFFFFFFF en
hexadicimal, lo mismo que en num1.

O más claro todavía haz:

Console.WriteLine("{0:x}",num1);

Console.WriteLine("{0:x}",num2);

Un Saludo.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida