PDA

View Full Version : [C] dubbio unsigned int


Carlez
15-03-2012, 01:44
perchè anche se uso unsigned int o unsigned long int il numero massimo che posso memorizzare rimane 2,147,483,647?? che devo usare per arrivare a 4,294,967,295?? :help:

ESSE-EFFE
15-03-2012, 08:58
perchè anche se uso unsigned int o unsigned long int il numero massimo che posso memorizzare rimane 2,147,483,647?? che devo usare per arrivare a 4,294,967,295?? :help:
Come fai a saperlo, lo vedi dal debugger o lo stampi? Nel secondo caso posta il codice.

__ZERO_UNO__
15-03-2012, 10:35
Nel caso utilizzassi il più diffuso compilatore in circolazione (gcc) leggi qui: http://gcc.gnu.org/onlinedocs/gcc-4.6.3/gcc/Integers-implementation.html#Integers-implementation

Carlez
15-03-2012, 15:03
Come fai a saperlo, lo vedi dal debugger o lo stampi? Nel secondo caso posta il codice.

in realtà mi serve per un applicazione totalmente diversa però per semplificarmi le cose ho iniziato a fare delle prove semplici tipo:

#include <stdio.h>
#include <stdint.h>

int main () {
unsigned int a;
unsigned long int b;
uint32_t c;

a=2147483647;
printf ("unsigned int: %d\n",a);

b=2147483647;
printf ("unsigned long int: %d\n",b);

c=2147483647;
printf ("uint32_t: %d\n",c);

return 0;
}

in questo codice se ad a,b e c assegno appunto 2147483647 l'output è giusto.
ma se incremento anche di una sola unità assegnando 2147483648 mi stampa -2147483648.
:confused:

ESSE-EFFE
15-03-2012, 15:12
in realtà mi serve per un applicazione totalmente diversa però per semplificarmi le cose ho iniziato a fare delle prove semplici tipo:


unsigned int a;
a=2147483648;
printf ("unsigned int: %u\n",a);



Probabilmente stai solo sbagliando a visualizzare. Prova come ho evidenziato (%u anzichè %d che è per i signed). Per sicurezza metti un break e verifica con il debugger il valore effettivo di a.

mrwinch
15-03-2012, 15:34
Quoto ESSE-EFFE: anche per me è un "problema" di printf che interpreta i 4 bytes come numero decimale ("%d") e non come unsigned decimale ("%u")

Carlez
15-03-2012, 15:52
si era proprio questo il problema..mamma mia che cavolata! :doh:
adesso passiamo allo step successivo: voglio creare un array di unsigned int di dimensione massima, quindi 4294967295, però ho dei problemi con la malloc:
#include <stdio.h>
#include <stdint.h>

int main () {
unsigned int *a;
unsigned int n;

n = 4294967295;
a = (unsigned int *)malloc(n*sizeof(unsigned int));
if (a==NULL) printf("Allocazione non riuscita!");
else printf ("Allocazione riuscita!");

return 0;
}

ci sono forse dei limiti di memoria massima allocabile?

ESSE-EFFE
15-03-2012, 15:58
adesso passiamo allo step successivo: voglio creare un array di unsigned int di dimensione massima, quindi 4294967295, però ho dei problemi con la malloc:

E lo credo, stai allocando più di 16GB di memoria... magari spiega meglio cosa stai cercando di fare, forse qualcuno potrà esserti d'aiuto...

Carlez
15-03-2012, 18:01
E lo credo, stai allocando più di 16GB di memoria... magari spiega meglio cosa stai cercando di fare, forse qualcuno potrà esserti d'aiuto...
si effettivamente è proprio così...ahahahah :muro:
stò studiando alcuni algoritmi di ordinamento e volevo fare dei test con degli array molto grandi..pensavo appunto a qualche miliardo di elementi. non c'è proprio modo vero?

marco.r
16-03-2012, 11:00
si effettivamente è proprio così...ahahahah :muro:
stò studiando alcuni algoritmi di ordinamento e volevo fare dei test con degli array molto grandi..pensavo appunto a qualche miliardo di elementi. non c'è proprio modo vero?

Se sei su una macchina a 64 bit mappa in memoria un file con mmap, e lo fai grande "quanto vuoi" (e aspetterai "quanto vuoi" :D)

psico88
17-03-2012, 11:49
Se vuoi fare delle prove con algoritmi di ordinamento non è necessario usare degli array così grandi. Avevo fatto già delle prove qualche annetto fa, e per mandare in crisi un algoritmo di ordinamento di complessità lineare (bubble sort e compagnia per intenderci) bastavano array di qualche decina di migliaia di elementi. Per gli algoritmi più veloci, qualche decina di milioni di elementi erano già sufficienti.