I'm trying to use 64 bit integers in C, but am getting mixed signals as to whether it should be possible.
When I execute the printf:
printf("Size of long int:%d\nSize of long long int:%d\n\n",(int)sizeof(long int), (int)sizeof(long long int));
The response I get is:
Size of long int:4 Size of long long int:8
This makes me feel that a long long int has 8 bytes = 64 bits.
However, when I try to declare the following 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;
The last 4 variables (f2,g2,h2,i2) give me the error message:
warning: integer constant is too large for ‘long’ type
I get the same result when I replace 'long long int' with 'int64_t'. I assume 'int64_t' was recognized, since it didn't generate any error messages of its own.
So, it appears my 8 byte long long int is really a 6 byte long long int, and I don't understand what I'm missing here. If it's any help, here is the information on my gcc compiler:
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)
If anyone knows how (or if) 64 bit integers are accessible to me, I'd really appreciate any help. Thanks....
LL
suffix, compiling with-std=c99
ought to work too. In C99, a hexadecimal integer constant has typelong long int
orunsigned long long int
if it is too large to fit in(unsigned) long int
, but fits in(unsigned) long long int
. No suffix needed. – Francinafrancinef2
toi2
, but the integer literals you specified. In C89 a integer literal without a specified suffix is of typeint
if the given value fits into that type, else it has the typelong int
. The problem is, that0x0000444400004
doesn't fit neither into theint
or thelong int
type and this is what the compiler is complaining about. The assignment isn't the problem here, you assign along int
to along long int
. As Daniel writes, c99 solves this by allowinglong long
literals. – Ridings