Pregunta

Es esto seguro:

int main()
{
    boost::int16_t t1 = 50000; // overflow here.
    boost::uint16_t t2 = (boost::uint16_t)t1;
    std::cout << t1 << " "  << t2 <<  std::endl;
}

Para ser aún más específico:? Estoy almacenando estos datos en una tabla que está utilizando tipos firmados en su esquema, ¿es seguro para almacenar y recuperar estos datos de esta manera

Gracias!

¿Fue útil?

Solución

No, creo que esto es definido por la implementación. Desde el C ++ proyecto de norma, §4.7 / 3

  

Si se firma el tipo de destino, el   valor no cambia si se puede   representado en el tipo de destino   (Y de bits de campo ancho); de lo contrario, la   valor de la implementación de fi nido.

Esto se aplica a la primera sentencia. Se firma int16_t, y no puede representar a 50000. Por lo tanto el valor de t1 depende de la aplicación.

Una vez que sepa t1, t2 está garantizada por §4.7 / 2 siendo el más bajo congruentes uint16_t módulo 2 ^ 16 a t1. Básicamente, t1 mod 2 ^ 16.

Otros consejos

Yo diría que es seguro, pero ¿por qué no usar un uint16_t sin pasar por este elenco engañosa?

Tipos existe también para la comunicación, no sólo por el bien del proceso de compilación.

La asignación de un número que no se puede representar en un tipo firmado es definido por la implementación. El siguiente conversión sin embargo, tiene un comportamiento definido estándar. Por lo que el resultado de la función se define la aplicación, si es seguro o no, es una cuestión subjetiva. Pero portable a través de plataformas o compiladores no lo es.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top