Pregunta

Tengo una rutina de nivel poco rápido que calcula un valor y devuelve un UInt32. Necesito almacenar este valor en SQL Server en un campo de 32 bits int. No quiero para aumentar el tamaño del campo, y sólo quiere almacenar el "bytes" de esta función el campo int.

Cientos de estos registros se solicitó a la vez, así que necesito la manera más rápida para convertir un UInt32 a int en un bucle. Si el bit más a la izquierda, se encuentra en el UInt32, se debe establecer el bit de signo del int (o hacer algo "repetible", en realidad, pero el bit de signo, probablemente sería más fácil).

En otras palabras, sólo quiero los 4 bytes de un UInt32 para convertirse en los 4 bytes de un int de 32 bits. Podría utilizar la clase BitConverter, pero no estoy seguro de que es la manera más rápida. ¿Sería más rápida de hacer esto con un área marcada como esto:

UInt32 fld = 4292515959;
unchecked {
    return (int)fld;
    // -2451337
}

Veo la pregunta inversa se ha pedido aquí, y estaba preguntando si la respuesta sería la misma en la otra dirección:

manera más rápida de int fundido a UInt32 bit a bit?

¿Fue útil?

Solución

Yo diría que la versión sin marcar (como unchecked((int)x)) es la forma más rápida, ya que no hay llamada al método. No creo que hay una manera más rápida.

Por cierto, UInt32 es sólo otro nombre para uint ... va una manera es lo mismo que ir de otra manera en términos de rendimiento, así que esto es realmente lo mismo que el enlace informados.


Editar: Recuerdo la observación de primera mano una instancia de un punto de referencia donde estaba checked rápido que unchecked (y no, no era una versión de depuración, que era una versión de lanzamiento con optimizaciones). No sé qué sucedió, pero en cualquier caso, no creo que usted va a ganar nada medible por el giro de la comprobación de desbordamiento.

Otros consejos

unchecked((int)x) se requiere consts solamente de fundición y marcado y sin marcar produce los mismos resultados (si el código puede compilar).

Por ejemplo este código

uint data = 4292515959;
int uncheckedData;
int checkedData;
unchecked {
    uncheckedData = (int)data;
}
checkedData = (int)data;

Console.WriteLine(data);
Console.WriteLine(uncheckedData);
Console.WriteLine(checkedData);

produce esta salida

4292515959
-2451337
-2451337

Para ser más concisa, este código puede ser compilado (mismo resultado que unchecked((int)data))

uint data = 4292515959;
checkedData = (int)data;

Este código (nótese la const) no puede ser compilado (requiere sin marcar)

const uint data = 4292515959;
checkedData = (int)data;

Este código puede no ser compilado, así (requiere sin marcar)

checkedData = (int)4292515959;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top