Conversión de tipo


De Wikipedia, la enciclopedia libre
  (Redirigido desde Conversiones de tipo )
Saltar a navegación Saltar a búsqueda

En informática , conversión de tipos , [1] [2] conversión de tipos , [1] [3] coerción de tipos , [3] y malabares de tipos [4] [5] son formas diferentes de cambiar una expresión de un tipo de datos a otro . Un ejemplo sería la conversión de un valor entero en un valor de punto flotante o su representación textual como una cadena , y viceversa. Las conversiones de tipos pueden aprovechar ciertas características de las jerarquías de tipos o representaciones de datos.. Dos aspectos importantes de una conversión de tipos son si ocurre implícitamente (automáticamente) o explícitamente , [1] [6] y si la representación de datos subyacente se convierte de una representación a otra, o si una representación dada se reinterpreta simplemente como la representación de otra tipo de datos. [6] [7] En general, se pueden convertir tanto los tipos de datos primitivos como los compuestos .

Cada lenguaje de programación tiene sus propias reglas sobre cómo se pueden convertir los tipos. Los lenguajes con mecanografía fuerte suelen realizar pocas conversiones implícitas y desalientan la reinterpretación de representaciones, mientras que los lenguajes con mecanografía débil realizan muchas conversiones implícitas entre tipos de datos. El lenguaje de escritura débil a menudo permite forzar al compilador a interpretar arbitrariamente un elemento de datos con diferentes representaciones; esto puede ser un error de programación no obvio o un método técnico para tratar directamente con el hardware subyacente.

En la mayoría de los lenguajes, la palabra coerción se usa para denotar una conversión implícita , ya sea durante la compilación o durante el tiempo de ejecución . Por ejemplo, en una expresión que mezcla números enteros y de coma flotante (como 5 + 0.1), el compilador convertirá automáticamente la representación de enteros en una representación de coma flotante para que las fracciones no se pierdan. Las conversiones de tipo explícitas se indican escribiendo código adicional (por ejemplo, agregando identificadores de tipo o llamando a rutinas integradas ) o codificando rutinas de conversión para que el compilador las utilice cuando de otra manera se detendría con una falta de coincidencia de tipos.

En la mayoría de los lenguajes similares a ALGOL , como Pascal , Modula-2 , Ada y Delphi , la conversión y el casting son conceptos claramente diferentes. En estos lenguajes, la conversión se refiere a cambiar implícita o explícitamente un valor de un formato de almacenamiento de tipo de datos a otro, por ejemplo, un número entero de 16 bits a un número entero de 32 bits. Las necesidades de almacenamiento pueden cambiar como resultado de la conversión, incluida una posible pérdida de precisión o truncamiento. La palabra emitir , por otro lado, se refiere a cambiar explícitamente la interpretación del patrón de bitsque representa un valor de un tipo a otro. Por ejemplo, 32 bits contiguos pueden tratarse como una matriz de 32 valores booleanos, una cadena de 4 bytes, un entero de 32 bits sin signo o un valor de punto flotante de precisión simple IEEE. Debido a que los bits almacenados nunca se cambian, el programador debe conocer detalles de bajo nivel, como el formato de representación, el orden de bytes y las necesidades de alineación, para emitir de manera significativa.

En la familia de lenguajes C y ALGOL 68 , la palabra cast se refiere típicamente a una conversión de tipo explícita (en oposición a una conversión implícita), lo que genera cierta ambigüedad sobre si se trata de una reinterpretación de un patrón de bits o una representación de datos reales. conversión. Más importante es la multitud de formas y reglas que se aplican a qué tipo de datos (o clase) se ubica mediante un puntero y cómo el compilador puede ajustar un puntero en casos como la herencia de objetos (clases).

Comparación de idiomas

Lenguajes similares a C

Conversión de tipo implícita

La conversión implícita de tipos, también conocida como coerción , es una conversión automática de tipos por parte del compilador . Algunos lenguajes de programación permiten que los compiladores proporcionen coerción; otros lo requieren.

En una expresión de tipo mixto, los datos de uno o más subtipos se pueden convertir a un supertipo según sea necesario en tiempo de ejecución para que el programa se ejecute correctamente. Por ejemplo, el siguiente es un código de lenguaje C legal :

doble d ; largo l ; int i ; si ( d > i ) d = i ;      si ( i > l ) l = i ;      si ( d == l ) d * = 2 ;      

Aunque d , l e i pertenecen a diferentes tipos de datos, se convertirán automáticamente en tipos de datos iguales cada vez que se ejecute una comparación o asignación. Este comportamiento debe usarse con precaución, ya que pueden surgir consecuencias no deseadas . Los datos se pueden perder al convertir representaciones de punto flotante a entero, ya que los componentes fraccionarios de los valores de punto flotante se truncarán (redondearán hacia cero). Por el contrario, la precisión se puede perder al convertir representaciones de entero a punto flotante, ya que un tipo de punto flotante puede no ser capaz de representar exactamente un tipo entero. Por ejemplo, podría ser un IEEE 754floattipo de precisión simple, que no puede representar el número entero 16777217 exactamente, mientras que un tipo entero de 32 bits sí puede. Esto puede conducir a un comportamiento poco intuitivo, como lo demuestra el siguiente código:

#include <stdio.h> int main ( vacío ) { int i_value = 16777217 ;    float f_value = 16777216.0 ;    printf ( "El entero es:% d \ n " , i_value );  printf ( "El flotante es:% f \ n " , f_value );  printf ( "Su igualdad:% d \ n " , i_value == f_value );   }

En compiladores que implementan flotantes como precisión simple IEEE e ints como al menos 32 bits, este código dará esta impresión peculiar:

El número entero es: 16777217
El flotador es: 16777216.000000
Su igualdad: 1

Tenga en cuenta que 1 representa la igualdad en la última línea de arriba. Este comportamiento extraño se debe a una conversión implícita de flotar cuando se compara con . La conversión provoca una pérdida de precisión, lo que hace que los valores sean iguales antes de la comparación.i_valuef_value

Conclusiones importantes:

  1. floatpara provocar el truncamiento , es decir, la eliminación de la parte fraccionaria.int
  2. doublea causa el redondeo de dígitos.float
  3. longa causas que caen del exceso de bits de orden superior.int
Promoción de tipo

Un caso especial de conversión de tipos implícita es la promoción de tipos, donde el compilador expande automáticamente la representación binaria de objetos de tipo entero o de punto flotante. Las promociones se usan comúnmente con tipos más pequeños que el tipo nativo de la unidad aritmética lógica (ALU) de la plataforma de destino , antes de las operaciones aritméticas y lógicas, para que tales operaciones sean posibles, o más eficientes si la ALU puede trabajar con más de un tipo. C y C ++ realizan dicha promoción para objetos de tipo booleano, carácter, carácter ancho, enumeración y enteros cortos que se promueven a int, y para objetos de tipo float, que se promueven a doble. A diferencia de otros tipos de conversiones, las promociones nunca pierden precisión ni modifican el valor almacenado en el objeto.

En Java :

int  x  =  3 ; doble  y  =  3,5 ; Sistema . fuera . println ( x  +  y );  // La salida será 6.5

Conversión de tipo explícita

La conversión de tipo explícita es una conversión de tipo que se define explícitamente dentro de un programa (en lugar de ser realizada por un compilador para la conversión de tipo implícita). Lo define el usuario en el programa.

doble da = 3,3 ;   doble db = 3,3 ;   doble dc = 3,4 ;   int resultado = ( int ) da + ( int ) db + ( int ) dc ; // resultado == 9 // si se usara la conversión implícita (como con "resultado = da + db + dc"), el resultado sería igual a 10        

Hay varios tipos de conversión explícita.

comprobado
Antes de realizar la conversión, se realiza una verificación en tiempo de ejecución para ver si el tipo de destino puede contener el valor de origen. De lo contrario, se genera una condición de error.
desenfrenado
No se realiza ninguna verificación. Si el tipo de destino no puede contener el valor de origen, el resultado no está definido.
patrón de bits
La representación de bits sin procesar de la fuente se copia literalmente y se vuelve a interpretar de acuerdo con el tipo de destino. Esto también se puede lograr mediante aliasing .

En programación orientados a objetos idiomas, los objetos también pueden ser abatido  : una referencia de una clase base se moldea a una de sus clases derivadas.

C # y C ++

En C # , la conversión de tipos se puede realizar de forma segura o insegura (es decir, similar a C), la primera se llama conversión de tipos comprobados . [8]

Animal  animal  =  nuevo  gato ();Bulldog  b  =  animal ( Bulldog )  ; // si (el animal es Bulldog), stat.type (animal) es Bulldog, de lo contrario una excepción b = animal as Bulldog ; // si (el animal es Bulldog), b = (Bulldog) animal, si no b = null      animal  =  nulo ; b  =  animal  como  Bulldog ;  // b == nulo

En C ++ se puede lograr un efecto similar usando la sintaxis de conversión de estilo C ++ .

Animal * animal = gato nuevo ;    Bulldog * b = static_cast < Bulldog *> ( animal ); // compila solo si Animal o Bulldog se deriva del otro (o del mismo) b = dynamic_cast < Bulldog *> ( animal ); // si (el animal es Bulldog), b = (Bulldog *) animal, else b = nullptr       Bulldog & br = static_cast < Bulldog &> ( * animal ); // igual que arriba, pero se lanzará una excepción si se devuelve un nullptr // esto no se ve en el código donde se evita el manejo de excepciones animal = nullptr ;       b = dynamic_cast < Bulldog *> ( animal ); // b == nullptr   eliminar animal ; // recursos siempre gratuitos  

Eiffel

En Eiffel, la noción de conversión de tipos está integrada en las reglas del sistema de tipos. La regla de asignación dice que una asignación, como:

x  : =  y

es válido si y solo si el tipo de su expresión de origen, yen este caso, es compatible con el tipo de su entidad de destino, xen este caso. En esta regla, compatible con significa que el tipo de expresión de origen se ajusta o se convierte en el del destino. La conformidad de los tipos se define mediante las reglas familiares para el polimorfismo en la programación orientada a objetos . Por ejemplo, en la asignación anterior, el tipo de se yajusta al tipo de xsi la clase en la que yse basa es descendiente de aquella en la que xse basa.

Definición de conversión de tipo en Eiffel

Las acciones de conversión de tipo en Eiffel, específicamente convierte a y convertidos del se definen como:

Un tipo basado en una clase CU se convierte en un tipo T basado en una clase CT (y T se convierte de U) si

CT tiene un procedimiento de conversión que utiliza U como tipo de conversión, o
CU tiene una consulta de conversión que enumera T como un tipo de conversión

Ejemplo

Eiffel es un lenguaje totalmente compatible con Microsoft .NET Framework . Antes del desarrollo de .NET, Eiffel ya tenía extensas bibliotecas de clases. El uso de bibliotecas de tipos .NET, particularmente con tipos de uso común como cadenas, plantea un problema de conversión. El software Eiffel existente usa las clases de cadena (como STRING_8) de las bibliotecas de Eiffel, pero el software Eiffel escrito para .NET debe usar la clase de cadena .NET ( System.String) en muchos casos, por ejemplo, al llamar a métodos .NET que esperan elementos de .NET tipo que se pasará como argumentos. Por lo tanto, la conversión de estos tipos de un lado a otro debe ser lo más fluida posible.

 my_string :  STRING_8  - Cadena Eiffel nativa  my_system_string :  SYSTEM_STRING  - Cadena nativa .NET ... mi_cadena  : =  mi_cadena_sistema

En el código anterior, se declaran dos cadenas, una de cada tipo diferente ( SYSTEM_STRINGes el alias compatible con Eiffel para System.String). Debido a System.Stringque no se ajusta a STRING_8, la asignación anterior solo es válida si se System.Stringconvierte en STRING_8.

La clase Eiffel STRING_8tiene un procedimiento de conversión make_from_cilpara objetos de tipo System.String. Los procedimientos de conversión también se designan siempre como procedimientos de creación (similares a los constructores). El siguiente es un extracto de la STRING_8clase:

 clase  STRING_8  ...  crear  make_from_cil  ...  convertir  make_from_cil  ({ SYSTEM_STRING })  ...

La presencia del procedimiento de conversión hace que la asignación:

 mi_cadena  : =  mi_cadena_sistema

semánticamente equivalente a:

 crea  my_string . make_from_cil  ( mi_cadena_sistema )

en el que my_stringse construye como un nuevo objeto de tipo STRING_8con contenido equivalente al de my_system_string.

Para manejar una asignación con origen y destino originales invertidos:

 mi_cadena_sistema  : =  mi_cadena

la clase STRING_8también contiene una consulta de conversión to_cilque producirá a System.Stringpartir de una instancia de STRING_8.

 clase  STRING_8  ...  crear  make_from_cil  ...  convertir  make_from_cil  ({ SYSTEM_STRING })  a_cil :  { SYSTEM_STRING }  ...

La asignación:

 mi_cadena_sistema  : =  mi_cadena

entonces, se convierte en equivalente a:

 mi_cadena_sistema  : =  mi_cadena . to_cil

En Eiffel, la configuración para la conversión de tipos se incluye en el código de la clase, pero luego parece ocurrir tan automáticamente como la conversión de tipos explícita en el código del cliente. No solo incluye asignaciones, sino también otros tipos de adjuntos, como la sustitución de argumentos (parámetros).

Oxido

Rust no proporciona conversión de tipo implícita (coerción) entre tipos primitivos. Pero, la conversión de tipo explícita (casting) se puede realizar usando la aspalabra clave. [9]

println! ( "1000 como u16 es: {}" , 1000 como u16 );   

Temas de seguridad

En la piratería , el encasillado es el uso indebido de la conversión de tipos para cambiar temporalmente el tipo de datos de una variable de cómo se definió originalmente. [10] Esto brinda oportunidades para los piratas informáticos, ya que en la conversión de tipos después de que una variable se "encasilla" para convertirse en un tipo de datos diferente, el compilador tratará esa variable pirateada como el nuevo tipo de datos para esa operación específica. [11]

Ver también

  • Downcasting
  • Información de tipo en tiempo de ejecución # transmisión dinámica y transmisión de Java
  • Tipo de juego de palabras

Referencias

  1. ↑ a b c Mehrotra, Dheeraj (2008). Ciencias de la computación de S. Chand . págs. 81–83. ISBN 978-8121929844.
  2. ^ Lenguajes de programación - Diseño y construcciones . 2013. p. 35. ISBN 978-9381159415.
  3. ↑ a b Reilly, Edwin (2004). Enciclopedia Concisa de Ciencias de la Computación . págs.  82, 110 . ISBN 0470090952.
  4. ^ Fenton, Steve (2017). Pro TypeScript: Desarrollo de JavaScript a escala de aplicación . págs. xxiii. ISBN 978-1484232491.
  5. ^ "PHP: Malabarismo de tipos - Manual" . php.net . Consultado el 27 de enero de 2019 .
  6. ↑ a b Olsson, Mikael (2013). Referencia rápida de sintaxis de C ++ . págs. 87–89. ISBN 978-1430262770.
  7. ^ Kruse, Rudolf; Borgelt, cristiano; Braune, Christian; Mostaghim, Sanaz; Steinbrecher, Matthias (16 de septiembre de 2016). Inteligencia computacional: una introducción metodológica . pag. 269. ISBN 978-1447172963.
  8. ^ Mössenböck, Hanspeter (25 de marzo de 2002). "C # avanzado: conversiones de tipos marcados" (PDF) . Institut für Systemsoftware, Johannes Kepler Universität Linz, Fachbereich Informatik. pag. 5 . Consultado el 4 de agosto de 2011 . en C # Tutorial
  9. ^ "Casting - Rust por ejemplo" . doc.rust-lang.org .
  10. ^ Jon Erickson Hacking, 2nd Edition: The Art of Exploitation 2008 1593271441 p51 "El encasillado es simplemente una forma de cambiar temporalmente el tipo de datos de una variable, a pesar de cómo se definió originalmente. Cuando una variable se encasilla en un tipo diferente, el compilador es básicamente dijo que tratara esa variable como si fuera el nuevo tipo de datos, pero solo para esa operación. La sintaxis para encasillamiento es la siguiente: (typecast_data_type) variable ... "
  11. ^ Arpita Gopal Magnifying C 2009 8120338618 p. 59 "De lo anterior, está claro que el uso de encasillamiento es hacer que una variable de un tipo actúe como otro tipo para una sola operación. Por lo tanto, al usar esta capacidad de encasillamiento es posible crear caracteres ASCII encasillando enteros a su ..."

enlaces externos

  • Casting en Ada
  • Transmitir en C ++
  • Guía de referencia de C ++ Por qué odio a los operadores de conversión de C ++, por Danny Kalev
  • Transmitiendo en Java
  • Conversiones implícitas en C #
  • Casting de tipos implícitos en Cppreference.com
  • Fundiciones estáticas y de reinterpretación en C ++
  • Upcasting y Downcasting en F #
Obtenido de " https://en.wikipedia.org/w/index.php?title=Type_conversion&oldid=1038376454 "