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).
@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.
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.
@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>intmain(int,char**){
std::cout << "unsigned long long " << sizeof(unsignedlonglong) << "\n";
std::cout << "unsigned long long int " << sizeof(unsignedlonglongint) << "\n";
return0;
}
int32_t
,uint64_t
etc. C ++ los recibirán con la próxima norma. Están en el encabezado<stdint.h>
.Respuestas:
Resumen ejecutivo: tiene 64 bits o más.
unsigned long long
es lo mismo queunsigned 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íalong long
en 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, useuint64_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).fuente
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.char
y byte, tiene razón. Si se equiparanchar
y octeto , entonces varía.sizeof(long long) == 1
y sería conforme.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.
fuente
Debe tener al menos 64 bits. Aparte de eso, se define la implementación.
Estrictamente hablando,
unsigned long long
no es estándar en C ++ hasta el estándar C ++ 0x.unsigned long long
es un 'especificador de tipo simple' para el tipounsigned long long int
(por lo que son sinónimos).El
long long
conjunto de tipos también está en C99 y era una extensión común de los compiladores de C ++ incluso antes de ser estandarizado.fuente
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; }
fuente