Exportar (0) Imprimir
Expandir todo

6.2.1 Conversiones explícitas numéricas

Visual Studio .NET 2003

Las conversiones explícitas numéricas son las conversiones de un tipo numérico a otro tipo numérico para el cual todavía no existe una conversión explícita numérica (Sección 6.1.2):

  • De sbyte a byte, ushort, uint, ulong o char.
  • De byte a sbyte y char.
  • De short a sbyte, byte, ushort, uint, ulong o char.
  • De ushort a sbyte, byte, short o char.
  • De int a sbyte, byte, short, ushort, uint, ulong o char.
  • De uint a sbyte, byte, short, ushort, int o char.
  • De long a sbyte, byte, short, ushort, int, uint, ulong o char.
  • De ulong a sbyte, byte, short, ushort, int, uint, long o char.
  • De char a sbyte, byte o short.
  • De float a sbyte, byte, short, ushort, int, uint, long, ulong, char o decimal.
  • De double a sbyte, byte, short, ushort, int, uint, long, ulong, char, float o decimal.
  • De decimal a sbyte, byte, short, ushort, int, uint, long, ulong, char, float o double.

Dado que las conversiones explícitas incluyen todas las conversiones numéricas implícitas y explícitas, siempre es posible convertir de cualquier tipo numérico a cualquier otro tipo numérico mediante una expresión de conversión de tipos (Sección 7.6.6).

Las conversiones explícitas numéricas pueden producir pérdida de información o incluso provocar excepciones. Una conversión explícita numérica se procesa como se explica a continuación:

  • Para una conversión de un tipo integral a otro tipo integral, el procesamiento depende del contexto de comprobación de desbordamiento (Sección 7.5.12) en el que tiene lugar la conversión:
    • En un contexto checked, la conversión termina correctamente si el valor del operando de origen queda dentro del intervalo del tipo de destino, pero inicia una excepción System.OverflowException si queda fuera de dicho intervalo.
    • En un contexto unchecked, la conversión siempre termina correctamente y procede como sigue.

      Si el tipo de origen es más grande que el de destino, el valor de origen se trunca descartando sus bits "extra" más significativos. Después el resultado se trata como un valor del tipo de destino.

      Si el tipo de origen es menor que el tipo de destino, el valor de origen se amplía con un signo o con ceros, de forma que tenga el mismo tamaño que el tipo de destino. La ampliación con signo se utiliza si el tipo de origen tiene signo; se utiliza la ampliación con ceros si el tipo de origen no lleva signo. Después el resultado se trata como un valor del tipo de destino.

      Si el tipo del origen tiene el mismo tamaño que el tipo de destino, el valor de origen se trata como un valor del tipo de destino.

  • Cuando se convierte un valor de tipo decimal a un tipo integral, el valor de origen se redondea hacia cero hasta el valor entero más próximo, y éste pasa a ser el resultado de la conversión. Si el valor entero resultante queda fuera del intervalo del tipo de destino, se produce una excepción System.OverflowException.
  • Para la conversión de un tipo float o double a otro tipo integral, el procesamiento depende del contexto de comprobación de desbordamiento (Sección 7.5.12) en el que tiene lugar la conversión:
    • En un contexto checked, la conversión sigue el siguiente procedimiento:

      Si el valor del operando es NaN o infinito, se inicia una excepción System.OverflowException.

      De lo contrario, el operando de origen se redondea hacia cero, hasta el valor integral más cercano. Si dicho valor se encuentra dentro del intervalo del tipo de destino, pasará a ser el resultado de la conversión.

      De lo contrario, se iniciará una excepción System.OverflowException.

    • En un contexto sin comprobar (unchecked), la conversión siempre funciona correctamente, según se indica a continuación.

      Si el valor del operando es NaN o infinito, el resultado de la conversión es un valor no especificado del tipo de destino.

      De lo contrario, el operando de origen se redondea hacia cero, hasta el valor integral más cercano. Si dicho valor se encuentra dentro del intervalo del tipo de destino, pasará a ser el resultado de la conversión.

      De no ser así, el resultado de la conversión será un valor no especificado del tipo de destino.

  • Para una conversión de double a float, el valor double se redondea al valor float más próximo. Si el valor double es demasiado pequeño para representarlo como float, el resultado se convierte en cero positivo o cero negativo. Si el valor double es demasiado grande para representarlo como float, el resultado se convierte en infinito positivo o infinito negativo. Si el valor double es NaN, el resultado también es NaN.
  • Para una conversión de float o double a decimal, el valor de origen se convierte a la representación decimal y se redondea hasta al número más próximo después de la posición decimal 28 si es necesario (Sección 4.1.7). Si el valor de origen es demasiado pequeño para representarlo como decimal, el resultado es cero. Si el valor de origen es NaN, infinito o demasiado grande para representarlo como decimal, se inicia una excepción System.OverflowException.
  • Para una conversión de decimal a float o double, el valor decimal se redondea al valor float o double más próximo. Aunque esta conversión puede perder precisión, nunca produce una excepción.
Mostrar:
© 2014 Microsoft