PDA

View Full Version : [C++] Come si stampa una LONGLONG


sottovento
07-04-2006, 13:16
Salve a tutti,
sto usando Visual Studio, e mi trovo a dover stampare (con la printf() ) il valore di una variabile LONGLONG. Qual e' il modificatore opportuno?

Grazie a tutti
Sottovento

cionci
07-04-2006, 13:34
Prova con %I64d

andbin
07-04-2006, 13:39
Salve a tutti,
sto usando Visual Studio, e mi trovo a dover stampare (con la printf() ) il valore di una variabile LONGLONG. Qual e' il modificatore opportuno?Io mi ero fatto addirittura una funzione apposita!
VOID WINAPI LonglongToStr (LONGLONG ll, LPTSTR lpszBuffer)
{
TCHAR cBuffer[24];
TCHAR *pch;
BOOL bNeg = FALSE;

if (ll < 0)
{
bNeg = TRUE;
ll = -ll;
}

pch = &cBuffer[23];

*pch = '\0';

while (ll > 0)
{
*(--pch) = ((TCHAR) (ll % 10)) + '0';
ll /= 10;
}

if (*pch == '\0')
*(--pch) = '0';

if (bNeg)
*(--pch) = '-';

lstrcpy (lpszBuffer, pch);
}
Nota che LONGLONG è definito nel SDK di Windows, quindi non è "standard". La wsprintf non mi sembra nemmeno che abbia un tipo di formattatore adatto.

andbin
07-04-2006, 13:56
Prova con %I64dSì, è vero: la printf con "%I64d" funziona. :doh:
Come al solito faccio le cose + complicate. :D

sottovento
07-04-2006, 14:49
Grazie mille, funziona perfettamente.

Un'ultima domanda: come faccio ad eseguire le quattro operazioni su questi benedetti numeri?

Grazie ancora
Sottovento

andbin
07-04-2006, 15:00
Grazie mille, funziona perfettamente.

Un'ultima domanda: come faccio ad eseguire le quattro operazioni su questi benedetti numeri?Esattamente come per altri tipi int, long, ecc...
È semplicemente un int più lungo a 64 bit.

sottovento
07-04-2006, 15:02
Ok. Grazie ancora

High Flying
Sottovento

cionci
07-04-2006, 15:12
http://www.codeproject.com/cpp/MulDiv64.asp

Comunque in linea di principio l'algoritmo per la moltiplicazione è facile... Basta suddividere gli operandi a 64 in "cifre" a 32 bit ed usare l'algoritmo per la moltiplicazione che si usa quando si fanno i conti a mano...

I risultati intermedi li metti in interi a 64 bit e poi li sommi... Ovviamente devi stare attento agli overflow...

Ad esempio:

A1 A2 *
B1 B2 =
______

Il risultato a 128 bit sarebbe: [A2*B2 + [(A1*B2) << 32]] + [A2*B1 + [(A1*B1) << 32] << 32

Quindi si capisce che il risultato su 64 bit è: A2*B2 + [(A1*B2 + A2*B1) << 32]...
Ovviamente a patto che A1*B2 e A2*B1 stiano su 32 bit...questo lo verifichi facilmente memorizzandoli su 64 bit...e testando che sia singolarmente che la loro somma sia inferiore di 2^32...

cionci
07-04-2006, 15:17
Che testa, le operazioni nromali funzionano tutte... :muro: :muro:

DanieleC88
07-04-2006, 16:15
Prova con %I64d
%lld non è proprio per i long long?

cionci
07-04-2006, 16:20
%lld non è proprio per i long long?
Se non sbaglio su Windows non funziona...più che altro su Visual C++...

cionci
07-04-2006, 16:28
Allora...mi sono un po' informato...il C99 ha standardizzato i long long a 64 bit (minimo)...ma Visual C++ non mi sembra compatibile con C99 ;)

71104
07-04-2006, 19:43
Allora...mi sono un po' informato...il C99 ha standardizzato i long long a 64 bit (minimo)...ma Visual C++ non mi sembra compatibile con C99 ;) Visual C++ ha il tipo __int64 (se lo scrivi nell'editor noterai che lo evidenzia come keyword).

andbin
08-04-2006, 10:38
Visual C++ ha il tipo __int64 (se lo scrivi nell'editor noterai che lo evidenzia come keyword).Infatti, se non mi sbaglio, LONGLONG è un typedef per __int64!