Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 27

Discussione: [C] interi e bytes

  1. #1
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936

    [C] interi e bytes

    Sto facendo un programma che deve lavorare con numeri di dimensioni elevatissime, non rappresentabili in 4, 8 o 12 bytes VVoVe:

    Questi numeri occuperebbero addirittura (nei casi piu' estremi) centinaia di bytes VVoVe: ...

    C'e' un modo di creare in C un tipo di dato intero che occupi così tanti bytes? Perche' l'int ne occupa 4, il long long e double ne occupano 8 e il long double 12, ma non sono sufficienti...

    PS: sono valori interi, non decimali, i cui bits hanno quindi la stessa disposizione che hanno nei char, negli short, negli int o nei long long int...

    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  2. #2
    Piccolo appunto,se non sbaglio dipende sia dal compilatore che dal sistema operativo però (almeno da me) il double ed il long double hanno la stessa identica dimensione di 8 byte (e non 12) ma magari col tuo SO e il tuo compiler la situazione è diversa.
    Detto questo purtroppo non ho soluzioni da darti peò la cosa interessa molto pure me,tanto che una volta mi ero persino proposto di realizzare una classe (o meglio un set di classi,una per ogni numero) C++,che risolvesse lo stesso problem,poi ho dovuto abandonare per mancanza di tempo.Perciò se trovi una soluzione esternamente a questo forum magari postala anche quì che mi interessa.Grazie
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  3. #3
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Originariamente inviato da unomichisiada
    Piccolo appunto,se non sbaglio dipende sia dal compilatore che dal sistema operativo però (almeno da me) il double ed il long double hanno la stessa identica dimensione di 8 byte (e non 12) ma magari col tuo SO e il tuo compiler la situazione è diversa.
    Detto questo purtroppo non ho soluzioni da darti peò la cosa interessa molto pure me,tanto che una volta mi ero persino proposto di realizzare una classe (o meglio un set di classi,una per ogni numero) C++,che risolvesse lo stesso problem,poi ho dovuto abandonare per mancanza di tempo.Perciò se trovi una soluzione esternamente a questo forum magari postala anche quì che mi interessa.Grazie
    Uso il gcc su GNU/Linux
    E le dimensioni sono queste (cito solo i tipi definiti dallo standard ansi):
    char: 1B
    short (short int): 2B
    int: 4B
    long (long int): 4B
    long long (long long int): 8B
    float: 4B
    double: 8B
    long double: 12B


    Pensavo di iniziare a fare qualche funzioncina da me... Pero' ho gia' riscontrato (molti/troppi) problemucci soprattutto per eseguire le operazioni (il C, a differenza del C++, non offre la possibilita' di eseguire l'overloading degli operatori) e fare funzioni tra array di char gestiti come se fossero un'unico tipo di dato e non un array e' un po' dura...
    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  4. #4

    Re: [C] interi e bytes

    Originariamente inviato da /dev/null
    C'e' un modo di creare in C un tipo di dato intero che occupi così tanti bytes? Perche' l'int ne occupa 4, il long long e double ne occupano 8 e il long double 12, ma non sono sufficienti...
    Potresti usare una libreria per la matematica a precisione arbitrara, tipo GMP ( http://www.swox.com/gmp/ )
    "Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".

  5. #5
    Capisco si in effetti il C è un po limitato sotto certi aspetti,comunque con un pò di pazienza ed impegno si può sicuramente fare.Mi semba strano però che il problema non sia stato risolto ,anzi risolto lo è stato di sicuro perchè matlab lo fa.Ora che ci penso octave (emulo di matlab per linux) è open source...magari dando una scopiazzatina....

    Oppure prova a seguire il link che ti hanno postato sopra che sembra interessante pure quello.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  6. #6
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936

    Re: Re: [C] interi e bytes

    Originariamente inviato da Ikitt
    Potresti usare una libreria per la matematica a precisione arbitrara, tipo GMP ( http://www.swox.com/gmp/ )
    Penso che sia piu' che sufficiente....



    Provate ad andare all'indirizzo:


    http://swox.com/cgi-bin/gmp_calc.pl?
    expr=999999999999999999999999999999999999999999999 99999999999999999999999999999999999999999999999999 99999999999999999999999999999999999999999999999999 99999999999999999999999999999999999999999999999999 99999999999999999999999999999999999999999999999999 99999999999999999999999999999999999999999999999999 99999999999999999999999999999999999999999999999999 99999999999999999999999999999999999999999999999999 99999999999999999999999999999999999999999999999999 99999999999999999999999999999999999999999999999999 999999999999-
    11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111123322323222 22222222222222222222222222222222222233223233323232 22222222211111122222222222222222222233333333333333 33333333333333333333333333333222222222222222221111


    !!! VVoVe: VVoVe: VVoVe:

    (qui' viene spezzato, voi mettetolo tutto su una sola linea

    Penso che quelli siano almeno una ventina di bytes
    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  7. #7
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Funziona alla perfezione!!!
    Grazie lkitt...
    Grazie anche a te unomichisiada... Dicevi che interessa anche a te poter avere interi enormi? Bhe' con queste librerie risolvi il problema

    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  8. #8
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Ehm, ho un nuovo problema...
    LE GMP possono tenere interi grossi praticamente infiniti bytes...
    Pero' per assegnargli un valore devo o passarglieli come stringa (ad esempio "546489489445965161594894948"), oppure posso passarglieli con il valore in un formato numerico standard (in pratica gli posso passare un double, float, int etc etc)...


    La mia situazione e' questa: ho un array di char che contiene un intero. Se la dimensione di questo array fosse di 4 bytes e' come se avessi un int, se invece fosse di 2 bytes e' come se avessi uno short... Potrei infatti eseguire il cast cosi':
    codice:
    char numero [2];
    *((short *) numero) = 45648;
    short X = *((short *) numero);
    Pero' questo array e' grosso molti bytes in piu'... Non soltanto 4, 8 o 12)


    A quelle funzioni pero' posso passare uno short o un int, non un intero su 32 bytes!

    Qualcuno sa darmi qualche consiglio?
    Ho provato anche a leggere i sorgenti di GMP, ma non ci ho capito NULLA, o meglio, non sono nemmeno riuscito a trovare la definizione sella struttra "mpz_t" ne' dove vengono definite alcune funzione
    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  9. #9
    Le librerie me le sto scaricando in questo istante.
    Vorrei aiutarti (anche se non è detto che ci riesca) però non ho capito bene il problema,e neanche bene la situazione.Potresti cercare di esporlo in maniera diversa così magari riesco a capire?
    L'unica cosa che ho capito per ora è che tu vuoi riuscire a memorizzare in una certa variabile ( il cui tipo presumo ti sia fornito da queste librerie) un valore molto grande (oltre i 12 bytes) e le funzioni di memorizzazione in questa variabile prendono il valore come stringa,giusto?E poi?Cosa ci devi fare con la variabile,e prchè non riesci ad utilizzarla?.Se non ho capito niente prova a rispiegarmelo magari mi viene in mente qualcosa se capisco.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  10. #10
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Originariamente inviato da unomichisiada
    Le librerie me le sto scaricando in questo istante.
    Vorrei aiutarti (anche se non è detto che ci riesca) però non ho capito bene il problema,e neanche bene la situazione.Potresti cercare di esporlo in maniera diversa così magari riesco a capire?
    L'unica cosa che ho capito per ora è che tu vuoi riuscire a memorizzare in una certa variabile ( il cui tipo presumo ti sia fornito da queste librerie) un valore molto grande (oltre i 12 bytes) e le funzioni di memorizzazione in questa variabile prendono il valore come stringa,giusto?E poi?Cosa ci devi fare con la variabile,e prchè non riesci ad utilizzarla?.Se non ho capito niente prova a rispiegarmelo magari mi viene in mente qualcosa se capisco.
    Provero' a espormi meglio (anche se sono proprio negato a parlare )...

    Le variabili intere (e senza segno) (di cui fanno parte anche i char, in quanto in realta' sono un intero che va da -128 a 127 (o da 0 a 255 gli unsigned) che rappresenta il codice ascii del carattere), a differenza di quelle decimali, vengono memorizzate nella RAM (o sul disco) in maniera binaria cosicche' leggendo il valore binario di una variaible, chiunque e' in grado di trovare il valore della variabile (ad esempio un char il cui valore binario e' "00000001" vale 1, mentre uno short con valore binario "00000001 00000010" vale 258 (256+2) )...

    Io dispongo gia' di un valore intero memorizzato in questo formato, ossia in binario (un valore che se quindi fosse su 4 bytes corrisponderebbe ad un int, mentre se fosse su 2 corrisponderebbe ad uno short ... ), ma che occupa molti bytes (ad esempio 20) *ovviamente per fare questo ho dovuto allocare 20 bytes in memoria e scrivere il valore in esso trattandolo come array di char*...
    Praticamente ho gia' un intero che occupa 20 bytes... Il problema e' che questo intero non e' supportato dalle funzioni e dagli operatori del C (ne' del C++), quindi se io provassi a stamparlo con la printf (o con la cout), questa lo tratterebbe come se fosse un int, tagliandogli 16 byte e considerandone soltanto 4, quelli occupati da un int...
    Oltre alle operazioni di stampa su files e su video (che corrispondono ad eseguire un itoa() che trasforma l'intero in stringa e quindi scrivere la stringa uscente sul file descriptor STDOUT_FILENO), mancano appunto anche il supporto degli operatori (che non eseguono somme, sottrazioni etc su tipi di dato diversi da quelli predefiniti) ed il supporto a funzioni tipo la itoa che trasformano il numero in stringa...

    Capito? Spero di essermi spiegato un po' meglio...

    Le funzioni della libreria GMP pero' permettono di memorizzare in una variabile un valore passatogli sottoforma di stringa (eseguendo una atoi modificata) o sottoforma di intero (di 4 bytes quindi, non di 20)... E come faccio io a passargli un intero che occupa 20 bytes?
    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.