[ Goran Arandjelovic @ 08.12.2005. 10:19 ] @
Moje pitanje je sledeće: Kako koristiti 64-bitnu vrednost sa GCC-om... long long mi baš ne uspeva.... dok kod MSVC++ radi normalno... |
[ Goran Arandjelovic @ 08.12.2005. 10:19 ] @
[ idb @ 08.12.2005. 11:35 ] @
Ja ga dosad nisam koristio ali izgleda da moze ovako:
Code: #include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]){ long long int i; long long j; i = 9223372036854775807LL; j = 9223372036854775807LL; cout <<"sizeof(i) = "<< sizeof(i)<<endl; cout <<"long long max = "<< i << endl; cout <<"sizeof(j) = "<< sizeof(j)<<endl; cout <<"long long max = "<< j << endl; system("PAUSE"); return EXIT_SUCCESS; } Malo sam iznenadjen da je ispravno long long int i long long, jednostavno nisam ocekivao, ali radi i ovo daje kao rezultat, ... sizeof(i) = 8 long long max = 9223372036854775807 sizeof(j) = 8 long long max = 9223372036854775807 Press any key to continue . . . Pogledaj i: Code: // From file: <limits.g> /* * The GNU C compiler also allows 'long long int' */ #if !defined(__STRICT_ANSI__) && defined(__GNUC__) #define LONG_LONG_MAX 9223372036854775807LL #define LONG_LONG_MIN (-LONG_LONG_MAX-1) #define ULONG_LONG_MAX (2ULL * LONG_LONG_MAX + 1) /* ISO C9x macro names */ #define LLONG_MAX LONG_LONG_MAX #define LLONG_MIN LONG_LONG_MIN #define ULLONG_MAX ULONG_LONG_MAX /* MSVC compatibility */ #define _I64_MIN LONG_LONG_MIN #define _I64_MAX LONG_LONG_MAX #define _UI64_MAX ULONG_LONG_MAX #endif /* Not Strict ANSI and GNU C compiler */ Windows XP SP2, Dev-C++ v4.9.9.2 with Mingw/GCC 3.4.2 [ Goran Arandjelovic @ 08.12.2005. 12:08 ] @
Da.. ali šta zapravo žnači ono LL na kraju? Kako ću to obezbediti kada budem računao nešto? Primer: ako imaš sledeću stvar...
Code: int main() { long long x = 100719879999; //broj sam uzeo kao primer... nebitna je njegova vrednost cout << x; } Ovo GCC neće uspeti da kompajlira, dok MSVC++ hoće. Šta sa tim? Ili, još bolje, ako imaš dva signed integera koja teže maksimalnim vrednostima... i ako njihov proizvod probaš da staviš u promenljivu x u ovom slučaju... desiće se greška.... [ Goran Arandjelovic @ 08.12.2005. 13:14 ] @
Heh... shvatio sam kako :)
Ako hoću long long rezultat... i jedan od operanada mora biti long long tipa... [ idb @ 08.12.2005. 14:13 ] @
Evo sad sam probao
Code: long long int i; i = 9223372036854775807LL; // ovde broju i dodeljujemo konstantnu vrednost // pa izgleda mora LL, inace se buni: // <integer constant is too large for "long" type> //dodao sam ovaj deo long k; k = 2147483647; long long int m; // ovaj deo daje netacno m m = k*k; cout<<"1. m = "<<m<<endl; m = 2147483647*2147483647; cout<<"2. m = "<<m<<endl; // ovaj deo daje tacan m = static_cast<long long int>(2147483647) * 2147483647; cout<<"3. m = "<<m<<endl; m = k * static_cast<long long int>(k); cout<<"4. m = "<<m<<endl; 1. m = 1 2. m = 1 3. m = 4611686014132420609 4. m = 4611686014132420609 izgleda da kompajler celobrojne vrednosti smatra po defaultu za int (ustvari kod GCC izjednacije int sa long = 4 byte), znaci treba mu staviti do znanja da treba da radi sa long long int i onda racuna tacno. Bar meni tako izgleda ... [ Goran Arandjelovic @ 08.12.2005. 14:54 ] @
Jeste...tako je, i kod mene su se javljale iste greške... što znači da u ovom konkretnom primeru barem jedna promenljiva mora biti long long...
Hvala puno. [ Dragi Tata @ 08.12.2005. 23:56 ] @
Citat: idb:izgleda da kompajler celobrojne vrednosti smatra po defaultu za int (ustvari kod GCC izjednacije int sa long = 4 byte), Generalno je opasno praviti takve pretpostavke. Na 64-bitnom Linuxu, long je 8 bajtova (64 bita). [ idb @ 09.12.2005. 09:38 ] @
Sasvim se slazem da je opasno. Treba misliti unapred i pazljivo planirati tipove promenljivih kako po opsegu, tako i po tacnosti (mislim na broj tacnih cifara).
[ caboom @ 09.12.2005. 12:08 ] @
hm, sto se tice standardnih celobrojnih vrednosti, sizeof() is your friend, sto se tice floating-point vrednosti C99 kompatibilni kompajler bi (uglavnom) trebalo da se konformira standardima:
http://en.wikipedia.org/wiki/IEEE_754 http://stevehollasch.com/cgindex/coding/ieeefloat.html http://grouper.ieee.org/groups...g-materials/2001-07-18-c99.pdf [Ovu poruku je menjao caboom dana 09.12.2005. u 13:08 GMT+1] [ Dragi Tata @ 09.12.2005. 13:46 ] @
Citat: caboom: hm, sto se tice standardnih celobrojnih vrednosti, sizeof() is your friend Ajde da budem malo "picajzla" :) sizeof vraća dužinu tipa u bajtovima, a po C (i C++) standardu, bajt je jednostavno dužina tipa char i uopšte ne mora da ima osam bita. "Pravo" rešenje nude C99-kompatibilni kompajleri, a to su fixed-width integers iz zaglavlja stdint.h, npr int8_t garantovano ima 8 bita, a int64_t 64 bita. Uz MSVC još uvek ne ide stdint.h, ali je lako napraviti nekoliko typedef-ova, kao što je: typedef __int64 int64_t To staviš između #ifdef-a koji bi osigurao da se poziva samo ako je u pitanju MSVC, i voziš :) [Ovu poruku je menjao Dragi Tata dana 09.12.2005. u 14:46 GMT+1] [ caboom @ 09.12.2005. 15:53 ] @
tacno, hvala na ispravci
[ leka @ 09.12.2005. 23:37 ] @
Gorane, __int64 nije standard - prema standardu treba da koristis int64_t, no ako se ne varam (a vidim da su neki pametniji vec pisali o tome) uz majkrosoftov kompajler ne dolaze zaglavlja sa ovim tipovima (sto ne treba da cudi - kad su se ljudi iz M$ trudili da postuju standarde...).
Za sada je jedino resenje da se, kao sto Dragi Tata rece, napravi alijas int64_t na __int64... [ Goran Arandjelovic @ 10.12.2005. 19:30 ] @
Jasno, mene je samo bunila notacija LL koja se mora staviti na kraju konstante inače ne pije vodu. Sve ovo me je zanimalo jer trenutno pravim klasu koja će raditi sa velikim brojevima, a zavisiće samo od raspoložive memorije (tip koji može imati bilo koju dužinu).
[ #Ninja# @ 10.12.2005. 21:30 ] @
[ Dragi Tata @ 11.12.2005. 03:24 ] @
Citat: leka: Gorane, __int64 nije standard - prema standardu treba da koristis int64_t, no ako se ne varam (a vidim da su neki pametniji vec pisali o tome) uz majkrosoftov kompajler ne dolaze zaglavlja sa ovim tipovima (sto ne treba da cudi - kad su se ljudi iz M$ trudili da postuju standarde...). Za sada je jedino resenje da se, kao sto Dragi Tata rece, napravi alijas int64_t na __int64... Ehm, strogo gledano int64_t je deo C standarda, a Visual C++ je C++ kompajler. Po C++ standardu se takve ekstenzije obavezno označavaju simbolom koji počinje sa "__" i VC++ u stvari poštuje standard :) Inače, mislim da je već usvojena odluka da se stdint.h uvede u sledeću verziju C++ standarda, pa kad se to desi Leka će imati puno pravo da pljuje M$ kako ne poštuje standarde ;) Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|