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;