¿Cuántos bytes tiene la longitud sin firmar?

81

¿Cuántos bytes son unsigned long long? ¿Es lo mismo que unsigned long long int?

Dushant
fuente
51
Haga sizeof (unsigned long long).
El pato comunista
2
Relacionados, algo así. stackoverflow.com/questions/4329777/…
John Dibling
2
Los estándares C y C ++ deberían adoptar cosas con el número en ellos, para anular la forma en que el compilador elige automáticamente. Algo como float32, float64, int32, etc.hasta el límite que necesitemos, ¿qué pasa con int256 o float1024? ... esto realmente eliminaría los dolores ...
jokoon
2
@gokoon: como he explicado en mi respuesta, el estándar C ya tiene int32_t, uint64_tetc. C ++ los recibirán con la próxima norma. Están en el encabezado <stdint.h>.
Fred Foo
1
¿Qué hay de flotar y doblar?
jokoon

Respuestas:

79

Resumen ejecutivo: tiene 64 bits o más.

unsigned long longes lo mismo que unsigned long long int. Su tamaño depende de la plataforma, pero el estándar C (ISO C99) garantiza que es de al menos 64 bits. No había long longen C89, pero aparentemente incluso MSVC lo admite, por lo que es bastante portátil.

En el estándar C ++ actual (publicado en 2003), no existe long long, aunque muchos compiladores lo admiten como una extensión. El próximo estándar C ++ 0x lo admitirá y su tamaño será el mismo que en C, por lo que al menos 64 bits.

Puede obtener el tamaño exacto, en bytes (8 bits en plataformas típicas) con la expresión sizeof(unsigned long long). Si desea exactamente 64 bits, use uint64_t, que se define en el encabezado <stdint.h>junto con un montón de tipos relacionados (disponibles en C99, C ++ 11 y algunos compiladores de C ++ actuales).

Fred Foo
fuente
2
@lars: sizeof(char) se garantiza que devolverá exactamente uno . Devuelve el tamaño del operando en número de bytes, no el número de "unidades de caracteres". Por lo tanto, no son bytes "en la mayoría de las plataformas", son bytes en todas las plataformas.
John Dibling
1
@John: eso depende de la definición de byte . Si equipara chary byte, tiene razón. Si se equiparan chary octeto , entonces varía.
Fred Foo
4
@lars: No, no es así. Un char es siempre exactamente un byte en cada plataforma. El estándar no especifica cuántos bits hay en un byte, pero eso es algo diferente. Una implementación podría usar bytes de 64 bits, lo que daría como resultado sizeof(long long) == 1y sería conforme.
John Dibling
1
@lars: Ya te voté a favor de todos modos, pero aquí hay un detalle: "garantizado por el estándar C (ISO C99) para ser al menos 64 bits == 8 bytes" ¡No puedo imaginar un mundo no integrado en el que 64 bits! = 8 bytes, pero el estándar no lo garantiza.
John Dibling
@John: de nuevo a la derecha. Se eliminaron los 64 bits == 8 bytes ya que ya estoy en modo de abogado de idiomas. Y he oído que en realidad hay plataformas integradas donde un byte es de 16 bits.
Fred Foo
17

La belleza de C ++, como C, es que el tamaño de estas cosas está definido por la implementación, por lo que no hay una respuesta correcta sin que especifiques el compilador que estás usando. ¿Son esos dos iguales? Si. "long long" es un sinónimo de "long long int", para cualquier compilador que acepte ambos.

Ernest Friedman-Hill
fuente
57
¿Belleza o maldición?
Michael Burr
2
Si bien lo que dice es técnicamente cierto, el estándar requiere que long long tenga al menos 64 bits de longitud, y no conozco ninguna implementación que defina cualquier tamaño que no sea 64 bits. Eso puede cambiar cuando salgan los compiladores de 128 bits, pero para los compiladores actuales no es exagerado asumir 64 bits.
Boaz Yaniv
2
+1, contrarrestando el voto negativo. La respuesta depende del significado de "es".
Andy Finkenstadt
3
@Andy: ¿Bill Clinton? ¿Eres tu? ;)
John Dibling
4
Esto no es en absoluto "La belleza de C ++", es un completo dolor: p
asimes
14

Debe tener al menos 64 bits. Aparte de eso, se define la implementación.

Estrictamente hablando, unsigned long longno es estándar en C ++ hasta el estándar C ++ 0x. unsigned long longes un 'especificador de tipo simple' para el tipo unsigned long long int(por lo que son sinónimos).

El long longconjunto de tipos también está en C99 y era una extensión común de los compiladores de C ++ incluso antes de ser estandarizado.

Michael Burr
fuente
1
"¿Recientemente ratificado?" La última vez que verifiqué, estaban considerando posponerlo para 2012.
Fred Foo
1
@In silico: lo leí. También leí en algún lugar sobre un posible retraso, pero honestamente no recuerdo dónde.
Fred Foo
1
@larsmans: A menos que vea una fuente oficial sobre el retraso del FDIS (una consulta del motor de búsqueda para "C ++ 0x FDIS delay" no me da resultados relevantes), espero que el estándar se publique en 2011, problemas graves dentro del estándar en sí mismo.
In silico
1
@In silico: Tampoco he encontrado la referencia, así que supongo que fue un rumor o un malentendido de mi parte. Aún así, no creo que el estado del FDIS sea lo mismo que la ratificación total, ¿verdad?
Fred Foo
3

Utilice el operador sizeof, le dará el tamaño de un tipo expresado en bytes. Un byte son ocho bits. Vea el siguiente programa:

#include <iostream>

int main(int,char**)
{
 std::cout << "unsigned long long " << sizeof(unsigned long long) << "\n";
 std::cout << "unsigned long long int " << sizeof(unsigned long long int) << "\n";
 return 0;
}
Alessandro Jacopson
fuente