Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

__int64 iliti long long (MSVC++ and GCC)

[es] :: C/C++ programiranje :: __int64 iliti long long (MSVC++ and GCC)

[ Pregleda: 4837 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.195.eunet.yu.



+9 Profil

icon __int64 iliti long long (MSVC++ and GCC)08.12.2005. u 10:19 - pre 223 meseci
Moje pitanje je sledeće: Kako koristiti 64-bitnu vrednost sa GCC-om...
long long mi baš ne uspeva.... dok kod MSVC++ radi normalno...
 
Odgovor na temu

idb
Ivan Bulic
Beograd

Član broj: 4436
Poruke: 402



Profil

icon Re: __int64 iliti long long (MSVC++ and GCC)08.12.2005. u 11:35 - pre 223 meseci
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

 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.135.eunet.yu.



+9 Profil

icon Re: __int64 iliti long long (MSVC++ and GCC)08.12.2005. u 12:08 - pre 223 meseci
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....
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.51.EUnet.yu.



+9 Profil

icon Re: __int64 iliti long long (MSVC++ and GCC)08.12.2005. u 13:14 - pre 223 meseci
Heh... shvatio sam kako :)
Ako hoću long long rezultat... i jedan od operanada mora biti long long tipa...
 
Odgovor na temu

idb
Ivan Bulic
Beograd

Član broj: 4436
Poruke: 402



Profil

icon Re: __int64 iliti long long (MSVC++ and GCC)08.12.2005. u 14:13 - pre 223 meseci
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 ...


 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.138.EUnet.yu.



+9 Profil

icon Re: __int64 iliti long long (MSVC++ and GCC)08.12.2005. u 14:54 - pre 223 meseci
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.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.dyn.optonline.net.



+6 Profil

icon Re: __int64 iliti long long (MSVC++ and GCC)08.12.2005. u 23:56 - pre 223 meseci
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).
 
Odgovor na temu

idb
Ivan Bulic
Beograd

Član broj: 4436
Poruke: 402



Profil

icon Re: __int64 iliti long long (MSVC++ and GCC)09.12.2005. u 09:38 - pre 223 meseci
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).
 
Odgovor na temu

caboom
Igor Bogicevic
bgd

Član broj: 255
Poruke: 1503
*.eunet.yu.

ICQ: 60630914


+1 Profil

icon Re: __int64 iliti long long (MSVC++ and GCC)09.12.2005. u 12:08 - pre 223 meseci
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]
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.dyn.optonline.net.



+6 Profil

icon Re: __int64 iliti long long (MSVC++ and GCC)09.12.2005. u 13:46 - pre 223 meseci
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]
 
Odgovor na temu

caboom
Igor Bogicevic
bgd

Član broj: 255
Poruke: 1503
..njuel-bg.customer.sbb.co.yu.

ICQ: 60630914


+1 Profil

icon Re: __int64 iliti long long (MSVC++ and GCC)09.12.2005. u 15:53 - pre 223 meseci
tacno, hvala na ispravci
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
..31.216.81.gus.vf.siwnet.net.

Sajt: dejan.lekic.org


+2 Profil

icon Re: __int64 iliti long long (MSVC++ and GCC)09.12.2005. u 23:37 - pre 223 meseci
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...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.1.EUnet.yu.



+9 Profil

icon Re: __int64 iliti long long (MSVC++ and GCC)10.12.2005. u 19:30 - pre 223 meseci
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).
 
Odgovor na temu

#Ninja#
Tuzla

Član broj: 28925
Poruke: 259
*.bih.net.ba.



+1 Profil

icon Re: __int64 iliti long long (MSVC++ and GCC)10.12.2005. u 21:30 - pre 223 meseci
Nemoj se mučit, Već je napravljeno. I radi.

http://www.elitesecurity.org/tema/134491
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.dyn.optonline.net.



+6 Profil

icon Re: __int64 iliti long long (MSVC++ and GCC)11.12.2005. u 03:24 - pre 223 meseci
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 ;)
 
Odgovor na temu

[es] :: C/C++ programiranje :: __int64 iliti long long (MSVC++ and GCC)

[ Pregleda: 4837 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.