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

Re: [OT][Lunghetto]: come avere numeri maggiori di 2^31 in C?



Premoli, Roberto ha scritto lo scorso 09/06/2006 11:20:
> (tm)Ciao *
> 
> Premetto che sono un neofita del C.
> Lavoro su una macchina x86.
> 
> I numeri interi usabili, di default, vanno da -2^31 a +2^31.
> 
> In un mio soft, ho necessita' di avere dei numeri (interi positivi) che
> possano contenere numeri grandi piu grande di 2^31.
> 
> Ho provato a impostare a fare questa funzione
> 
> Int Moltiplica()
> {
> Long long 1 = 1;
> int n;
> for (n=0;n<35;n++)
>    {
>    i=i*2;
>    printf("%d\n",i);
>    }
> return 0;
> }
> 
> ma arrivato a 2^32 imposta un numero negativo e i successivi soni tutti
> a zero: cosa devo fare per avere questi benedetti interi da 0 a (2^64)-1

Che dire? Mi hai messo una pulciona nell'orecchio:

con questo programmino:
carlo@dantooine$ cat test.c
#include <stdio.h>

int main (int argc, char *argv[])
{
        unsigned int       i;
        unsigned long long num;

        for (i = 0; i < 65; i ++) {
                num = 1 << i;
                printf ("i = %i, 2^%i = %llu\n", i, i, num);
        }
        return 0;
}

ottengo questo risultato:

Breakpoint 1, main (argc=1, argv=0xbfe909c4) at test.c:10
10                      printf ("i = %i, 2^%i = %llu\n", i, i, num);
3: x/xg &num  0xbfe90940:       0x0000000020000000
2: num = 536870912
1: i = 29
(gdb)
Continuing.
i = 29, 2^29 = 536870912

Breakpoint 1, main (argc=1, argv=0xbfe909c4) at test.c:10
10                      printf ("i = %i, 2^%i = %llu\n", i, i, num);
3: x/xg &num  0xbfe90940:       0x0000000040000000
2: num = 1073741824
1: i = 30
(gdb)
Continuing.
i = 30, 2^30 = 1073741824

Breakpoint 1, main (argc=1, argv=0xbfe909c4) at test.c:10
10                      printf ("i = %i, 2^%i = %llu\n", i, i, num);
3: x/xg &num  0xbfe90940:       0xffffffff80000000
2: num = 18446744071562067968
1: i = 31
(gdb)
Continuing.
i = 31, 2^31 = 18446744071562067968

Breakpoint 1, main (argc=1, argv=0xbfe909c4) at test.c:10
10                      printf ("i = %i, 2^%i = %llu\n", i, i, num);
3: x/xg &num  0xbfe90940:       0x0000000000000001
2: num = 1
1: i = 32
(gdb)
Continuing.
i = 32, 2^32 = 1

Breakpoint 1, main (argc=1, argv=0xbfe909c4) at test.c:10
10                      printf ("i = %i, 2^%i = %llu\n", i, i, num);
3: x/xg &num  0xbfe90940:       0x0000000000000002
2: num = 2
1: i = 33

Che sia un baco di gcc (gcc version 4.0.4 20060507 (prerelease) (Debian
4.0.3-3)?



Reply to: