El otro día, I came across este constructo:¿Qué tan portátil está lanzando -1 a un tipo sin firmar?
static_cast<size_type>(-1)
en algún ejemplo código C++, que es probable (dependiendo de los detalles de donde size_type
es de) a ser equivalente a la siguiente C:
(size_t)(-1)
Según tengo entendido, funciona basado en el hecho de que la representación de -1 en dos aritmética de complemento es 11111...1
, para tantos bits como usted tenga, por lo que esta es una manera rápida de obtener el valor máximo que un tipo sin signo como size_t
puede contener. Sin embargo, tengo entendido que C no garantiza que se utilizará el complemento a dos; si la implementación de C usa el complemento de uno, este será 1 menos que el valor máximo, y si usa la magnitud con signo, será un poco más de la mitad del valor máximo.
¿Hay alguna arruga que me falta que asegure que esto funciona bien independientemente de la representación de los enteros con signo que se utilizan? ¿Difiere entre C y C++ (muchas cosas sorprendentes lo hacen)?
Si quiere estar seguro, siempre hay 'std :: numeric_limits :: max()'. –
UncleBens
Creo que situaciones como esta tienen static_cast y reinterpret_cast en el lenguaje: static_cast puede proporcionarle algo predecible (y por lo tanto útil) pero que podría tener una implementación más lenta en algunas plataformas, mientras que reinterpret_cast puede eliminar cualquier garantía. – Kylotan
Esto es en mi humilde opinión la mejor manera de obtener un número de todos los bits.Las opciones que usan '~ 0U' también funcionan (y si olvida agregar' U' y do '~ 0' puede terminar con todos los bits 0, por ejemplo) - pero usando' -1' fundido al tipo 'unsigned' , siempre funciona independientemente del tipo. Por lo tanto, no tiene que preocuparse por usar 'ULL' o para convertirlo en' unsigned short' primero; puede usar '-1' y asignarlo :) Vea también http://stackoverflow.com/questions/809227/ is-it-safe-to-use-1-to-set-all-bits-to-true –