2010-02-11 7 views

Respuesta

9

En este caso, el static_cast<> es una 'conversión de tipo explícita. la norma tiene esto que decir acerca de las conversiones integrales en 4.7/3 "conversiones integral":

Si se firma el tipo de destino, el valor no se modifica si se puede representar en el tipo de destino (y el ancho campo de bits); de lo contrario, el valor está definido por la implementación.

Desde short se garantiza que sea capaz de mantener el valor 200 (short debe ser de al menos 16 bits), a continuación, para su ejemplo específico la respuesta es sí. Varios compiladores se adhieren bastante bien a este comportamiento: ha sido así desde los días anteriores a ANSI de C, y tanto código depende del comportamiento que los proveedores de compiladores parecen reacios incluso a emitir advertencias sobre la posibilidad de truncamiento.

-2

Si el valor está dentro del rango de short, entonces el valor está garantizado que es correcto, que en su caso es verdadero, entonces y == 200.

Si cae fuera (por ejemplo, static_cast<short>(1000000000)), el comportamiento no está definido. La mayoría de los compiladores truncarán los dígitos binarios hasta el tamaño correcto.

+0

Comportamiento no indefinido, no especificado. – GManNickG

+4

@GMan: no especificado, pero definido por la implementación. Hay una diferencia sutil: para la implementación definida hay un comportamiento específico que la implementación necesita documentar, que no es necesaria para un comportamiento no especificado. La diferencia entre el comportamiento "no especificado" y "indefinido" es que generalmente hay un conjunto de comportamientos permitidos para los no especificados, mientras que para los indefinidos todo vale (incluido el bloqueo). –

+0

@Michael: es bueno saberlo, gracias. – GManNickG

Cuestiones relacionadas