Newsgroup: it.comp.lang.c++
Titolo: Come rappresentare gli int su 64 bit?

Come da oggetto, visto che avrei bisogno di fare un calcolo che supera il
valore di 2^31 - 1 avrei bisogno di rappresentare gli int su 64 bit, ho già
provato con un long int, ma anche questo risulta essere rappresentato su
32bit... come fare?
--
XplodR
e-mail: 
NO-SPAM-...@inwind.it
     TOGLIERE NO-SPAM-2- X RISPONDERE
Redattore della FAQ sulla masterizzazione
http://cdrfaq.sytes.net

 32bit... come fare?
Prova con:
__int64 nHuge;      // Declares 64-bit integer
-- 
Luc.

 __int64 nHuge;      // Declares 64-bit integer
Perfetto, cosě funziona, grazie 1000!!!
--
(-:  Enjoy!  :-)
------
XplodR
------
e-mail: 
NO-SPAM-...@inwind.it
     TOGLIERE NO-SPAM-2- X RISPONDERE
ICQ: 11938825 (XplodR)
--===--


 Perfetto, cosě funziona, grazie 1000!!!
. ma non č standard. Percui se tra i tuoi obiettivi c'č la portabilitŕ
non ti conviene usarlo. In caso contrario, vai pure tranquillo.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 non ti conviene usarlo. In caso contrario, vai pure tranquillo.
Capisco, e di standard c'è qualcosa?
Utilizzando il metodo __int64 quali potrebbero essere i problemi?
Mi serve per un semplice programma da far girare sotto dos...


 Mi serve per un semplice programma da far girare sotto dos...
nessun problema, se ce li hai funziona tutto correttamente, se non ce li
hai manco compila. In ogni caso potresti fare una cosa del genere:
typedeffi __int64 con qualche altro nome, ad esempio:
typedef __int64 bigint
e poi usi bigint. Così, nel caso mancasse __int64 su un ipotetico
compilatore su cui tu dovessi ritrovarti a fare il porting, ti bastarebbe
cambiare il typedef e saresti a posto. 


 wrote

E se uno vuole scriverli a console come fa? C'e' un modo gia' fatto o
bisogna farselo?
Tommy

 Mi serve per un semplice programma da far girare sotto dos...
Ci sono molte classi che ti danno modo di avere numeri intere di "infinita"
** precisione.
La maggior parte di queste utilizzano C++ standard e possono essere usate in
qualsiasi compilatore.
Fai una ricerca su google, ne esistono parecchie.
Nel caso piu' semplice, ti trovi un header file da includere e poi un nuovo
tipo da usare:
<CODE>
#include<iostream>
#include"CInfInt.h"
CInfInt factorial(CInfInt n)
{
    CInfInt tmp=n;
    if(!n)n=1;
    while(tmp>1)n*=--tmp;
    return n;
}
int main()
{
    std::cout << factorial(256) << std::endl;
    return 0;
}
</CODE>
<OUTPUT>
+857817775342842654119082271681232625157781520279485619859655650377269452553
1475
8937744029136045140845037588534233658430615719683469369647532228928849742602
5679
6373325633687864426752076267945601879688679715211433077020775266464514647091
8732
6100832876325702818980773671781454170250523018608495319068138257481070252817
5594
5947698703466571273813928620523475680821886070120361108315209350194743710910
1726
9682628616062636624350228409441914084246159360000000000000000000000000000000
0000
0000000000000000000000000000
</OUTPUT>
Altri sono un tantino piu' complessi!
Alcuni sono molto veloci altri piuttosto lenti!
Tommy
**= si fa per dire.

 su 32bit... come fare?
Puoi definire la tua variabile di tipo "long long" (ed e' standard!).

 Puoi definire la tua variabile di tipo "long long" (ed e' standard!).
ISO C++:
On some systems, the type long long is used in a few system header files.
This type is not ISO C++ conforming. To allow this type, but enforce
conformance otherwise, use the command line option
sequence --strict --long_long.
Questo e' quello che dice una pagina del compilatore INTEL, datata 2003!
In pratica non e' standad!
Tommy

 sequence --strict --long_long.
Ooops! Hai ragione!
Il mio gcc non mi dice niente nemmeno se compilo con i parametri "-ansi 
-Wall", devo dirgli un "-pedantic" perche mi dia una warning del tipo:
  warning: ISO C++ does not support `long long'

 bisogna farselo?
Come ti e' stato detto __int64 non fa parte dello standard, e quindi
per manipolare dati di questo tipo devi utilizzare strumenti specifici
della tua piattaforma. Prova a chiedere su un newsgroup specifico.
Ciao,
Nicola

 In pratica non e' standad!
Quindi sapevo e so che non e' standard! (il long long e nemmeno il __int64)
Visto che Luc consigliava di usarli volevo chiedere se sul VC++ (compilatore
che sicuramente usa) c'e' un modo per stamparli a console.
Se non lo sa fa uguale, non mi interessa cosi' tanto da iniziare un nuovo
post! Se lo sapeva bene, altrimenti.....
In pratica grazie per il consiglio, ma non importa, non provero' a chiedere
ad un altro newsgroup specifico.
Tommy

 Capisco, e di standard c'è qualcosa?
Sfruttando il collegamento con codice C (extern "C")
puoi, magari senza neppure cambiare compilatore, scriverti
una funzione esterna in C99, che supporta da standard i long long
--
Gerolamo

 che sicuramente usa) c'e' un modo per stamparli a console.
Non ho mai dovuto stamparli... %ld non funziona?
-- 
Luc.

 Luc.
Guarda tu stesso... fino a che occupa meno di 4 bytes (sulla mia macchina e
sul mio compilatore etc...) lo stampa correttamente in quanto e' come un
__int32. Quando incomincia a crescere oltre invece....
<CODE>
#include<stdio.h>
int main()
{
    __int64 a64=500;
    __int64 b64=500000000; // 500.000.000
    __int64 c64;
    printf("%ld\n",a64);
    printf("%ld\n",b64);
    c64=a64*b64;
    printf("%ld\n",c64);
    // dovrebbe essere: 250.000.000.000
    return 0;
}
</CODE>
<OUTPUT>
500
500000000
891896832
Press any key to continue
</OUTPUT>
Come vedi il risultato della moltiplicazione dovrebbe essere:
250.000.000.000 invece viene scritto: 891896832
Inutile dire che cout fa pure peggio... non compilando il programma e
dicendo "'operator <<' is ambiguous".
Il fatto che printf e cout non funzionino e' palese, sono librerie standard
e.... __int64 non lo e'!
Mi chiedevo pero' se ci fosse stato qualche cosa di altro per stampare un
__int64 anche a console.
Tommy

Se sai che __int64 (o long long che sia) non e' standard, perche'
perseveri nel mandare messaggi fuori tema? Soprattutto quando usi il
compilatore piu' documentato della terra e quindi basta una
velocissima ricerca in rete per trovare quello che chiedi?
Ciao,
Nicola

>Non ho mai dovuto stamparli... %ld non funziona?
E... quando le persone mi pongono una domanda rispondo. Era OT, non dovevo
rispondere?
Per cio' che riguarda il compilatore piu' documentato della terra, e' vero
ma come ti ho dett non mi interessa.... era una curiosita' non degna di
nulla. Avevo lasciato perdere, poi mi e' stata posta la domanda ed ho
risposto. Ora finisce che la faccio questa breve ricerca perche' cosi'
almeno la faccio finita (e anche tu).
Spero che questa risposta sia meno OT di quanto non fosse la mia precedente
risposta sgli __int64 ;-)
Credo di osservare la netiquette e le regole del NG in modo accettabile (se
pur non impeccabile, ma non credo nessuno lo faccia). Credo inoltre di
contribuire a mio modo a questo NG. Lasciami vivere..... (se non ti piace,
mi spiace, non ho intenzione di alterare il mio comportamento. Si sono
testardo, ho una certa chiusura mentale e per finire sono cattivo e
perseguito!!! Mah, ti rendi conto del ritratto che ne viene fuori.... ed
invece perdo circa 1 ora al giorno per rispondere ai msg di questo ng e di
quello di C, bella riconoscenza!)
Tommy

 perseguito!!!
Tanto per fare un altro OT, volevo dire "persevero (nel sbagliare)".
Tommy

> Tanto per fare un altro OT, volevo dire "persevero (nel sbagliare)".
Eddai Tommy, non ti mettere a fare il permaloso...
Spesso non si sente l'intonazione del mittente leggendo un post.... :-)
A volte è una fortuna!! ;-)
Ciao, Marta