variable tipos tipo tabla sirve rangos que programacion para long datos dato c 64bit 64-bit sizeof

tipos - Cómo especificar enteros de 64 bits en c



unsigned int para que sirve (5)

Estoy tratando de usar enteros de 64 bits en C, pero recibo señales mixtas sobre si debería ser posible.

Cuando ejecuto el printf:

printf("Size of long int:%d/nSize of long long int:%d/n/n",(int)sizeof(long int), (int)sizeof(long long int));

La respuesta que obtengo es:

Tamaño de int largo: 4 Tamaño de int largo: 8

Esto me hace sentir que un int largo largo tiene 8 bytes = 64 bits.

Sin embargo, cuando intento declarar las siguientes variables:

long long int a2 = 0x00004444; long long int b2 = 0x000044440; long long int c2 = 0x0000444400; long long int d2 = 0x00004444000; long long int e2 = 0x000044440000; long long int f2 = 0x0000444400004; long long int g2 = 0x00004444000044; long long int h2 = 0x000044440000444; long long int i2 = 0x0000444400004444;

Las últimas 4 variables (f2, g2, h2, i2) me dan el mensaje de error:

advertencia: la constante entera es demasiado grande para el tipo ''largo''

Obtengo el mismo resultado cuando reemplazo ''long long int'' con ''int64_t''. Supongo que ''int64_t'' fue reconocido, ya que no generó ningún mensaje de error propio.

Entonces, parece que mi int de 8 bytes de largo es realmente un int de 6 bytes de largo, y no entiendo lo que me falta aquí. Si es de ayuda, aquí está la información en mi compilador gcc:

me@ubuntu:~$ gcc -v Using built-in specs. Target: i686-linux-gnu Configured with: ../src/configure -v --with-pkgversion=''Ubuntu/Linaro 4.4.4-14ubuntu5'' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ - -enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu Thread model: posix gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)

Si alguien sabe cómo (o si) los enteros de 64 bits son accesibles para mí, realmente agradecería cualquier ayuda. Gracias....


Cómo especificar enteros de 64 bits en c

Ir en contra de la buena idea habitual de agregar LL .

Agregar LL a una constante entera asegurará que el tipo sea al menos tan ancho como long long . Si la constante entera es octal o hexadecimal, la constante quedará unsigned long long si es necesario.

Si no le importa especificar un tipo demasiado ancho, entonces LL está bien. De lo contrario, sigue leyendo.

long long puede ser más ancho que 64 bits.

Hoy en día, es raro que long long no sea de 64 bits, pero C especifica que long long debe ser de al menos 64 bits. Entonces, al usar LL , en el futuro, el código puede especificar, por ejemplo, un número de 128 bits.

C tiene macros para constantes enteras que en el siguiente caso serán de tipo int_least64_t

#include <stdint.h> #include <inttypes.h> int main(void) { int64_t big = INT64_C(9223372036854775807); printf("%" PRId64 "/n", big); uint64_t jenny = INT64_C(0x08675309) << 32; // shift was done on at least 64-bit type printf("0x%" PRIX64 "/n", jenny); }

salida

9223372036854775807 0x867530900000000


Anexar sufijo ll a dígitos hexadecimales para 64 bits (largo largo int), o sufijo ull para 64 bits sin signo (largo largo sin signo)


Pruebe con un sufijo LL en el número, el compilador puede convertirlo a un tipo intermedio como parte del análisis. Ver http://gcc.gnu.org/onlinedocs/gcc/Long-Long.html

long long int i2 = 0x0000444400004444LL;

Además, el compilador está descartando los ceros 0x000044440000 , por lo que 0x000044440000 está convirtiendo en 0x44440000 , que es un entero de 32 bits perfectamente aceptable (por lo que no está viendo ninguna advertencia antes de f2 ).


Use int64_t , ese código C99 portátil.

int64_t var = 0x0000444400004444LL;

Para imprimir:

#define __STDC_FORMAT_MACROS #include <inttypes.h> printf("blabla %" PRIi64 " blabla/n", var);


Use stdint.h para tamaños específicos de tipos de datos enteros, y también use sufijos apropiados para constantes literales enteras, por ejemplo:

#include <stdint.h> int64_t i2 = 0x0000444400004444LL;