To je jasný ...
int je na obou architekturách stejný (4 bajty)
long je na 32bitech roven int, na 64bitech ale už 8 bajtů
long long už je opět stejný - 8 bajtů.
docela matoucí, bych řekl. Doufám, že jsem c-guru tímto postem neurazil :-)
já fakt nevěřím, že na 32 bit a 64 bit platformě se to bude chovat jinak: prostě příslušná verze libc pro 32bit a 64bit architekturu bude mít příslušně ošetřený tisk daného formátu, ne ? do problémů by ses dostal jen kdyby si to zkompiloval jinde a snažil se pak používat 32 bit binárku proti 64bit knihovně, nebo naopak...
formátovací řetězce pro printf() jsou v C pravda trochu opruz, no, s tím se asi nedá nic dělat. já jsem jednou rozhodl pro C právě proto, že tyhle věci umím, a očekávám tedy, že si díky tomu udržím nějakou kontrolu nad vývoje... a ne že si bude někdo paralelně releasovat nějaké neoficiální codeforky místo aby používal naše SVN (hergot, to dev.arachne.cz sice už je udělaný, ale pořád tam chybí port-redirect, nebo je možná nějaký problém s SSL certifikátem jak pro CZF tak i pro veřejnou adresu... hmmm)
na spolupráci jsme se snad již dohodli, ne? Releasovat jsem začal jenom proto, že tvoje poslední verze byla trochu obsolete ... a popravdě - nefungovala mi, případně potom nevyhovovala. Nemluvě o tom, že jsi již mockrát prohlásil - pokud vám tam něco chybí, dopište si to, je to GPL. A změny jsem zveřejnil. (a to dle mě GPL nezakazuje paralelní codeforky, ne? Když na to přijde, můžu to přejmenovat a nechat tam poznámku, z čeho vycházím. Pokud se pletu, opravte mě).
o formátovacích řetězcích se hádat nebudu. ty podle mě snad fungujou ... momentální problém, který řešíme je aritmetika nad celými čísly ... samozřejmě, že nepouštím jednu binárku na různých architekturách, ale kompiluju to vždy na místě.
zkus si na různých architekturách:
int main(int argc, char **argv)
{
printf("sizeof(char) == %d\n", sizeof(char));
printf("sizeof(short) == %d\n", sizeof(short));
printf("sizeof(int) == %d\n", sizeof(int));
printf("sizeof(long) == %d\n", sizeof(long));
printf("sizeof(long long) == %d\n", sizeof(long long));
return 0;
}
Uznávám, že úpravy kvůli tomuto problému bys měl dělat asi jenom ty. Ale holt jsem chtěl kopečkovi pomoct ... moje Dčko beru jako poslední moji vlastní verzi, dokonce ji ani nepoužívám, protože nemusím.
ale no, já si v zásadě nestěžuju, já jen tvrdím, že je nejvyšší čas mergnout to.
no ale jinak sizeof() a formátovací modifikátor pro printf() jsou dvě různé věci. na jakékoliv platformě fakt musí modifikátor %d vytisknout správně int a %ld musí vytisknout správně long ... fakt ... (a ještě je tuším %Ld pro tvůj long long...)
long line = 75000;
long up = 75000;
long max = 75000;
printf("%d\n", max*up/line);
Na 32bitech je zobrazený výsledek 17733, na 64bit to je 75000.
při proměnných long long je výsledek na obou stejný a správný.
Dokonce i printf("%d\n", (long long)max*up/line); je správně ... ta matematika nesmí být v závorce.
Ale s tím formátováním máš zjevně pravdu ... mělo by tam být %Ld nebo spíš %Lu. Naštěstí je to v tomto případě naprosto fuk ... takový internet, aby se v kilobitech nevešel do 4 bajtů snad nikdo přes promethea neprovozuje :-)
Asi oba hledáme a vidíme chybu jinde ... ale stojím si za tím, že ve formátování to není ... Že ty to nemáš jak na 64 bitech vyzkoušet, co?
Závěr: všechny důležité proměnné by měly být long long. Mírně větší paměťová náročnost je u tohoto typu softu přeci naprosto nevýznamná.
P.S.: zkoumám to průběžně :-) proto jsem to v kódu nepoužil ...