[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Allocating 64 bits

From: Dirk Hoffmann
Subject: Re: Allocating 64 bits
Date: Fri, 10 Mar 2006 14:28:19 +0100 (CET)

On 9 Mar 2006, Paulo Matos wrote:

> I'd like to have access to 64 bits. I think unsigned long long is 64
> bits in g++ although I'm not sure. Is there a way to know which type is
> 64 bits long or not?

Try this:

 $ cat > longlong.C
#include <cstdio>
int main() {
        unsigned long long a=0;
        printf("long long is %d bytes (%d bits).\n", sizeof(a), sizeof(a)*8);
        return 0;

  $ make longlong
g++   -L/usr/X11R6/lib -lX11 -lm  longlong.C   -o longlong

 $ longlong
long long is 8 bytes (64 bits).

> Still, even if I know that unsigned long long is 64 bits long, how can
> I know that it will occupy only two registers in a 32bit PC, or 1
> register in a 64bit PC? Is there a way to make sure a 64 bit value, be
> it an unsigned long long or a unsigned char v[8] to be kept on 2
> registers or 1 in 32 bit or 64 bit PC respectively?

 $ g++ longlong.C -S
 $ cat longlong.s
[... you will find among the 40 lines output (on intel CPU systems) lines like 
: ]
        leal    -8(%ebp), %eax
        addl    $45054, (%eax)
        adcl    $0, 4(%eax)

Where 45054 (dec., which is 0xAFFE hex) is added in two steps (LSB=45054,
MSB=0) to the variable "a" (stored at -8(%ebp), then %eax).

If I had an installation where "g++ -m64" works, I could compare the 
results. Maybe you can do it (using "diff" on the *.s files produced with 
and without that option) yourself with these indications.

PS: The precise answer (if needed) to your question is: The value is kept in
8 consecutive bytes, longlong-word aligned, in the memory, no matter if your
system is "32 bit" or "64 bit". But operations are executed 32-bit wise
here. My example doesn't involve CPU registers (except for pointers).

reply via email to

[Prev in Thread] Current Thread [Next in Thread]