Cuando codifique en lenguajes de bajo nivel como CI, descubra que la conversión a veces significa 'reinterpretar estos bytes como si siempre hubiera sido de este otro tipo' y otras veces como 'convertir este valor de manera inteligente en este otro tipo'.
¿Cuál es el significado original de la palabra y hay alguna coherencia en cuándo esperar una conversión y cuándo esperar una reinterpretación en bruto?
terminology
type-casting
Alexander Torstling
fuente
fuente
cast
en el sentido de la informática es más similar a la fundición en el sentido de la metalurgia, por el cual la forma de un metal fundido se reforma cuando se vierte en un molde: britannica.com/EBchecked/topic/377665/metallurgy/81884/CastingRespuestas:
Lanzar en C es único, muy diferente a otros lenguajes. Tampoco es nunca inteligente.
La conversión en C convierte los valores de un tipo a otro utilizando reglas cuidadosamente definidas. Si realmente necesita saber, lea el estándar. De lo contrario, los puntos principales son:
Algunos lanzamientos se aplican implícitamente, y en algunos de ellos el compilador emitirá una advertencia. ¡Lo mejor es prestar atención a las advertencias!
La definición del diccionario para el reparto se ignora mejor, ya que no es útil. Muchos lanzamientos se describen mejor con los términos conversión o coerción, por lo que vale la pena conocerlos también.
C ++ es MUCHO más complicado, pero no lo preguntaste, ¿verdad?
fuente
T*
avoid*
y de regreso es siempre bien definido.Esta parte del diccionario Webster da la definición adecuada:
Entonces, antes de lanzar, su "objeto" (no literalmente un objeto OOP) está en una forma (tipo) dada. Cuando lo vuelves a lanzar, eso es "vierte hormigón" a su alrededor para darle una nueva forma, eso es lo que haces con la fundición. Tienes un número como un entero en forma de hexágono, y después de lanzar, obtendrás una cadena en forma de rectángulo.
fuente
Puede ser útil separar los moldes de C en dos grupos:
Conversiones numéricas: convierta un número entre una representación en otra, intentando mantener el valor. Por ejemplo,
(int)3.1
sería3
. Hay reglas exactas que definen lo que sucede cuando no se puede mantener el valor exacto.Lanzamientos de puntero: mantenga la dirección de memoria, pero cambie la forma en que se desreferencia. Por ejemplo, for
float x=3.5
,*(int *)&x
dará1080033280
- este número entero está representado por el mismo patrón de bits que representa el flotante3.5
.fuente
Keep the memory address, but change the way it's dereferenced.
No se define la referencia a un puntero de tipo punteado. El estándar sólo garantiza la fundición deA *
aB *
y la parte posterior producirá la mismaA *
, que puede no haber sido válido para eliminar la referencia en el 1er lugar - o que siB *
es unachar *
, puede ser utilizado para leer la representación de objetos de cualquier tipo. Para todos los demás tipos, elB *
puntero de desreferenciación es punteo de tipo, UB y viola el alias estricto. De todos modos, incluso si el compilador no descartó el ejemplo 2 anterior por esa razón, está haciendo suposiciones inportables sobre patrones de bitsEn C ++, los diversos tipos de conversiones pueden hacerse más explícitos, con el
reinterpret_cast
significado de "tratar estos bytes como si ya fueran esta otra cosa". En C puede hacerlo absolutamente explícito utilizando aunion
, la conversión con el(type)
operador intentará mantener el resultado numéricamente equivalente, hasta la pérdida de precisión.fuente
int*
palabra ychar*
dos palabras [con el segundo byte seleccionando el byte alto o bajo de una palabra]. Lanzar un(int*)
to(char*)
requeriría la adición de una palabra adicional que debería ser cualquier valor que especifique el primer byte delint
.