Re: integer groesser 2^31 in C
Hallo, Am Montag, 30. Jun 2003, 16:14:47 +0200 schrieb Daniel Hofmann: Achim Fritz [EMAIL PROTECTED] writes: Hi, fuer ein Finite-Element-Programm in C, muesste ich unbedingt mehr als 2Gb Speicher allokieren. Der Rechner hat 2Gb Speicher und 2Gb Swap. Ich habe erst gedacht, es liegt am Kernel (CONFIG_HIGHMEM ist gesetzt), habe jetzt aber festgestellt, dass es nicht moeglich ist in C eine Integer zu deklarieren, die groesser als 2^31 ist. Bezüglich der Größe von Integertypen macht der C - Standard lediglich folgende Zusicherung: char = short = int = long Ich hab's gerade nochmal nachgeschlagen (im Stroustrup): außerdem wird zugesichert, daß sizeof (short) = 16 bit sizeof (long) = 32 bit ist. [...] Ob Du nun aber so große Speicherbereiche allozieren kannst, und ob Dein Programm das wirklich tun muß, bezweifele ich eher. Wenn Dein Programm 2GB Speicher haben will, ist es mit großer Wahrscheinlichkeit falsch. Gruß Bertram -- Bertram Scharpf Stuttgart, Deutschland/Germany -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: integer groesser 2^31 in C
Hi! Hi, fuer ein Finite-Element-Programm in C, muesste ich unbedingt mehr als 2Gb Speicher allokieren. Der Rechner hat 2Gb Speicher und 2Gb Swap. Ich habe erst gedacht, es liegt am Kernel (CONFIG_HIGHMEM ist gesetzt), habe jetzt aber festgestellt, dass es nicht moeglich ist in C eine Integer zu deklarieren, die groesser als 2^31 ist. AFAIK ist int immer Prozessor-Register breite - 32Bit int - 31Bit + Vorzeichen unsigned int - 32 Bit Peter -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: integer groesser 2^31 in C
On Sun, 29 Jun 2003 17:11:42 +0200 (CEST) Achim Fritz [EMAIL PROTECTED] wrote: Hi, fuer ein Finite-Element-Programm in C, muesste ich unbedingt mehr als 2Gb Speicher allokieren. Der Rechner hat 2Gb Speicher und 2Gb Swap. du kannst nicht mehr als 4GB Speicher allokieren da der pointer datentyp 32Bit ist (auf 32Bit Maschinen). (void*) zum beispiel. es ist auch nicht moeglich, mehrere 4GB bereiche zu allokieren, da in C der gesamte allokierte Speicherbereich über Pointer zugänglich sein muss. gleichwohl mag linux insgesamt mehr als 4GB RAM verwalten, so dass einzelne Prozesse (nicht Threads!) jeweils die 4GB erreichen können. Ich habe erst gedacht, es liegt am Kernel (CONFIG_HIGHMEM ist gesetzt), habe jetzt aber festgestellt, dass es nicht moeglich ist in C eine Integer zu deklarieren, die groesser als 2^31 ist. zunächst einmal #include sys/types.h und dann: u_int32_t int32_t usw. verwenden statt int und long long. sonst ist dein code nicht portabel. datentypen wie int und long etc. sind per definition eine sünde und jede programmiersprache die sie besitzt ist murx. ausnahme zum beispiel das gute alte lisp, wo der datentyp int seinem namen gerecht wird und _beliebig_ grosse zahlen aufnehmen kann. doch zurueck zum thema, du musst also zunaechst einmal klarstellen, welche datentypen du verwenden moechtest. jetzt zu deinem problem mit der zuweisung: u_int32_t x = 4294967295; -- mist.c:5: warning: decimal integer constant is so large that it is unsigned das problem ist hier, dass der compiler die symbole zunaechst einmal einzeln parst. er sieht eine ziffernfolge: 234879 und macht daraus ein Integer Symbol, also eine Konstante vom Datentyp int. Je nach compiler und platform ergeben sich daraus unterschiedliche limitierungen. bei einer 32bit maschine ist zum beispiel 2147483647 der groesstmoegliche wert. bei einer 16bit maschine ist es halt 32767. dass du das hier in eine variable zuweisst, die den wert aufnehmen kann ist zu dem zeitpunkt unbekannt. der compiler sieht einfach diese zahl und will sie einlesen. ergo musst du ihm sagen, dass es sich hierbei um eine grosse zahl handelt: u_int32_t x = 4294967295u; siehst du das u am ende der zahl? das steht fuer unsigned. er soll also hier keinen int lesen, sondern einen unsigned int. dann klappts auch, weil der wert da reinpasst. das problem geht aber noch weiter: u_int64_t y = 2u; mist.c:6: integer constant out of range das ding passt eben nicht in einen unsigned int. zumindest nicht auf einer 32bit maschine! also musst du machen: u_int64_t y = 2ll; ll steht fuer long long. ja richtig, der grosse mist mit unportablen datentyp- groessenangaben setzt sich hier leider fort und alles ist wieder unportabel. wenigstens kriegst du compiler errors wenn du das suffix hinten nicht richtig gemacht hast. wenn du jetzt an das limit vorzeichenloser 64 bit zahlen faehrst: u_int64_t oo=18446744073709551615ll; -- mist.c:7: warning: decimal integer constant is so large that it is unsigned musst du eben das u wieder dazu machen: u_int64_t oo=18446744073709551615ull; das gesamte integer handling ist kacke in C und in den meisten anderen sprachen leider auch. Hab schon mehrere Compiler ausprobiert (unter anderem auch Borland auf Windows) und in den manpage von gcc nach optionen gesucht. (2.4.21 hab ich auch schon getestet) es ist unabhaengig vom compiler. C ist so definiert. Der Kernel hat auch keine Probleme mit grossen Zahlen: [EMAIL PROTECTED]:~/ugspeicher/test-proc echo 2^31|bc 2147483648 [EMAIL PROTECTED]:~/ugspeicher/test-proc echo 2^32|bc 4294967296 [EMAIL PROTECTED]:~/ugspeicher/test-proc echo 2^100|bc 1267650600228229401496703205376 das hat nichts mit dem kernel zu tun. bc ist ein programm, und das kann es halt. Hat jemand ne Ahnung, oder ne Idee? jep. probier mal: #include stdio.h #include stdlib.h int main() { void *buf = malloc ( (size_t) (30u) ); // genau 3 GB if (buf==0) printf(oh no\n); else printf(yeah\n); return 0; }; du musst denke ich deinen algorithmus gruendlich ueberdenken und mittels zwischenspeichern auf festplatte den speicherbedarf __drastisch__ reduzieren. das daemliche unix 32-bit design in verbindung mit der diesbezueglich ziemlich daemlichen Sprache C erbringt uns derzeit das naechste grosse problem der art wie sie schon so oft da war. man denke nur an das alte MS-DOS mit expanded memory, extended memory, hi memory area, 64kb offset size und 16bit pointer sowie dem pseudo 32bit pseudo seg+offs pointermist. erste auslaeufer sind erkennbar mit den sogenannten large-files. sie koennen groesser als 2GB sein. man muss seine programme entsprechend umprogrammieren, damit sie mit solchen dateien umgehen koennen. der naechste mist ist schon vorprogrammiert. bei 128bit maschinen gibt es dann large-large files. besonders sinnvolle namensgebung uebrigens. MfG Erik -- Erik Thiele -- Haeufig gestellte Fragen und Antworten (FAQ):
Re: integer groesser 2^31 in C
Achim Fritz wrote: [...] de.comp.lang.c de.comp.lang.iso-c++ sind die Gruppen deiner Wahl... [EMAIL PROTECTED]:~/ugspeicher/test-proc cat testint.c #include stdlib.h int main(void){ long long int a=22; int b=22; printf(a=%d\n,a/1000); printf(b=%d\n,b); exit(0); } [EMAIL PROTECTED]:~/ugspeicher/test-proc gcc testint.c testint.c: In function `main': testint.c:4: warning: decimal constant is so large that it is unsigned testint.c:5: warning: decimal constant is so large that it is unsigned [EMAIL PROTECTED]:~/ugspeicher/test-proc ./a.out a=220 b=-2094967296 Funktioniert bei mir [...] Der Kernel hat auch keine Probleme mit grossen Zahlen: [EMAIL PROTECTED]:~/ugspeicher/test-proc echo 2^31|bc 2147483648 [EMAIL PROTECTED]:~/ugspeicher/test-proc echo 2^32|bc 4294967296 [EMAIL PROTECTED]:~/ugspeicher/test-proc echo 2^100|bc 1267650600228229401496703205376 Was hat das mit dem Kernel zu tun? Stefan -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: integer groesser 2^31 in C
On Mon, 30 Jun 2003, Erik Thiele wrote: On Sun, 29 Jun 2003 17:11:42 +0200 (CEST) Achim Fritz [EMAIL PROTECTED] wrote: Hi, fuer ein Finite-Element-Programm in C, muesste ich unbedingt mehr als 2Gb Speicher allokieren. Der Rechner hat 2Gb Speicher und 2Gb Swap. du kannst nicht mehr als 4GB Speicher allokieren da der pointer datentyp 32Bit ist (auf 32Bit Maschinen). (void*) zum beispiel. es ist auch nicht moeglich, mehrere 4GB bereiche zu allokieren, da in C der gesamte allokierte Speicherbereich über Pointer zugänglich sein muss. gleichwohl mag linux insgesamt mehr als 4GB RAM verwalten, so dass einzelne Prozesse (nicht Threads!) jeweils die 4GB erreichen können. Ich habe erst gedacht, es liegt am Kernel (CONFIG_HIGHMEM ist gesetzt), habe jetzt aber festgestellt, dass es nicht moeglich ist in C eine Integer zu deklarieren, die groesser als 2^31 ist. zunächst einmal #include sys/types.h und dann: u_int32_t int32_t usw. verwenden statt int und long long. sonst ist dein code nicht portabel. datentypen wie int und long etc. sind per definition eine sünde und jede programmiersprache die sie besitzt ist murx. ausnahme zum beispiel das gute alte lisp, wo der datentyp int seinem namen gerecht wird und _beliebig_ grosse zahlen aufnehmen kann. doch zurueck zum thema, du musst also zunaechst einmal klarstellen, welche datentypen du verwenden moechtest. jetzt zu deinem problem mit der zuweisung: u_int32_t x = 4294967295; -- mist.c:5: warning: decimal integer constant is so large that it is unsigned das problem ist hier, dass der compiler die symbole zunaechst einmal einzeln parst. er sieht eine ziffernfolge: 234879 und macht daraus ein Integer Symbol, also eine Konstante vom Datentyp int. Je nach compiler und platform ergeben sich daraus unterschiedliche limitierungen. bei einer 32bit maschine ist zum beispiel 2147483647 der groesstmoegliche wert. bei einer 16bit maschine ist es halt 32767. dass du das hier in eine variable zuweisst, die den wert aufnehmen kann ist zu dem zeitpunkt unbekannt. der compiler sieht einfach diese zahl und will sie einlesen. ergo musst du ihm sagen, dass es sich hierbei um eine grosse zahl handelt: u_int32_t x = 4294967295u; siehst du das u am ende der zahl? das steht fuer unsigned. er soll also hier keinen int lesen, sondern einen unsigned int. dann klappts auch, weil der wert da reinpasst. das problem geht aber noch weiter: u_int64_t y = 2u; mist.c:6: integer constant out of range das ding passt eben nicht in einen unsigned int. zumindest nicht auf einer 32bit maschine! also musst du machen: u_int64_t y = 2ll; ll steht fuer long long. ja richtig, der grosse mist mit unportablen datentyp- groessenangaben setzt sich hier leider fort und alles ist wieder unportabel. wenigstens kriegst du compiler errors wenn du das suffix hinten nicht richtig gemacht hast. wenn du jetzt an das limit vorzeichenloser 64 bit zahlen faehrst: u_int64_t oo=18446744073709551615ll; -- mist.c:7: warning: decimal integer constant is so large that it is unsigned musst du eben das u wieder dazu machen: u_int64_t oo=18446744073709551615ull; das gesamte integer handling ist kacke in C und in den meisten anderen sprachen leider auch. Hab schon mehrere Compiler ausprobiert (unter anderem auch Borland auf Windows) und in den manpage von gcc nach optionen gesucht. (2.4.21 hab ich auch schon getestet) es ist unabhaengig vom compiler. C ist so definiert. Der Kernel hat auch keine Probleme mit grossen Zahlen: [EMAIL PROTECTED]:~/ugspeicher/test-proc echo 2^31|bc 2147483648 [EMAIL PROTECTED]:~/ugspeicher/test-proc echo 2^32|bc 4294967296 [EMAIL PROTECTED]:~/ugspeicher/test-proc echo 2^100|bc 1267650600228229401496703205376 das hat nichts mit dem kernel zu tun. bc ist ein programm, und das kann es halt. Hat jemand ne Ahnung, oder ne Idee? jep. probier mal: #include stdio.h #include stdlib.h int main() { void *buf = malloc ( (size_t) (30u) ); // genau 3 GB if (buf==0) printf(oh no\n); else printf(yeah\n); return 0; }; Hallo Erik, erstmal danke fuer Deine ausfuehrliche Beschreibung. leider funktioniert es nicht: oh no (mit 20u gehts) Noch ne Idee? Gruss Achim du musst denke ich deinen algorithmus gruendlich ueberdenken und mittels zwischenspeichern auf festplatte den speicherbedarf __drastisch__ reduzieren. das daemliche unix 32-bit design in verbindung mit der diesbezueglich ziemlich daemlichen Sprache C erbringt uns derzeit das naechste grosse problem der art wie sie schon so oft da war. man denke nur an das alte MS-DOS mit expanded memory, extended memory, hi memory area, 64kb offset size und 16bit pointer sowie dem pseudo 32bit pseudo seg+offs pointermist. erste auslaeufer sind erkennbar mit den sogenannten large-files. sie koennen groesser als 2GB sein. man muss seine programme entsprechend umprogrammieren, damit sie
Re: integer groesser 2^31 in C
Es gibt Compiler, die einen Typ int64 eingebaut haben (VC6 zum Beispiel) und andere, die 64 Bit Zahlen in einer struct LARGE_INTEGER in einer *.h Datei anbieten (z.B. BCB ab v3). Was die verschiedenen GNU Versionen haben weiß ich noch nicht. Es ist jedoch leicht, eine Klasse für Operationen mit 64 Bit Zahlen selbst zu bauen (oder eine Sammlung Funktionen in C) -- nur die Ausgabe per printf ist eine langweilige Fleißarbeit. Gruß, gw Achim Fritz wrote: Hi, fuer ein Finite-Element-Programm in C, muesste ich unbedingt mehr als 2Gb Speicher allokieren. Der Rechner hat 2Gb Speicher und 2Gb Swap. Ich habe erst gedacht, es liegt am Kernel (CONFIG_HIGHMEM ist gesetzt), habe jetzt aber festgestellt, dass es nicht moeglich ist in C eine Integer zu deklarieren, die groesser als 2^31 ist. [EMAIL PROTECTED]:~/ugspeicher/test-proc cat testint.c #include stdlib.h int main(void){ long long int a=22; int b=22; int c=20; printf(a=%d\n,a); printf(b=%d\n,b); printf(c=%d\n,c); exit(0); } [EMAIL PROTECTED]:~/ugspeicher/test-proc gcc testint.c testint.c: In function `main': testint.c:4: warning: decimal constant is so large that it is unsigned testint.c:5: warning: decimal constant is so large that it is unsigned [EMAIL PROTECTED]:~/ugspeicher/test-proc ./a.out a=-2094967296 b=-2094967296 c=20 Hab schon mehrere Compiler ausprobiert (unter anderem auch Borland auf Windows) und in den manpage von gcc nach optionen gesucht. (2.4.21 hab ich auch schon getestet) Der Kernel hat auch keine Probleme mit grossen Zahlen: [EMAIL PROTECTED]:~/ugspeicher/test-proc echo 2^31|bc 2147483648 [EMAIL PROTECTED]:~/ugspeicher/test-proc echo 2^32|bc 4294967296 [EMAIL PROTECTED]:~/ugspeicher/test-proc echo 2^100|bc 1267650600228229401496703205376 Und noch was: [EMAIL PROTECTED]:~/ugspeicher/test-proc ulimit -a core file size(blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files(-n) 1024 pipe size (512 bytes, -p) 8 stack size(kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes(-u) 7168 virtual memory(kbytes, -v) unlimited Hat jemand ne Ahnung, oder ne Idee? Gruss Achim -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: integer groesser 2^31 in C
On Sun, Jun 29, 2003 at 05:11:42PM +0200, Achim Fritz wrote: Hi, fuer ein Finite-Element-Programm in C, muesste ich unbedingt mehr als 2Gb Speicher allokieren. Der Rechner hat 2Gb Speicher und 2Gb Swap. Ich habe erst gedacht, es liegt am Kernel (CONFIG_HIGHMEM ist gesetzt), habe jetzt aber festgestellt, dass es nicht moeglich ist in C eine Integer zu deklarieren, die groesser als 2^31 ist. [schnipp] Ich hab zwar seid ewig nicht mehr in C entwickelt, aber 1. es ist sicher möglich, 2. das ist wohl eigentlich die falsche mailingliste. Der Kernel hat auch keine Probleme mit grossen Zahlen: [EMAIL PROTECTED]:~/ugspeicher/test-proc echo 2^31|bc 2147483648 [EMAIL PROTECTED]:~/ugspeicher/test-proc echo 2^32|bc 4294967296 [EMAIL PROTECTED]:~/ugspeicher/test-proc echo 2^100|bc 1267650600228229401496703205376 BC verwendet IMHO intern keine festen Datengrößen sondern arbeitet mit dynamischen Strukturen, um mit beliebiger Genauigkeit zu rechnen. Hat jemand ne Ahnung, oder ne Idee? C-Entwicklerliste? -billy -- Meisterbohne Meisterbohne GbR, Küfner,Mekle, MeierTel: +49-731-399 499-0 eLösungen Söflinger Straße 100 Fax: +49-731-399 499-9 89077 Ulm http://www.meisterbohne.de/ -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: integer groesser 2^31 in C
On Mon, 30 Jun 2003 11:34:57 +0200 (CEST) Achim Fritz [EMAIL PROTECTED] wrote: On Mon, 30 Jun 2003, Erik Thiele wrote: On Sun, 29 Jun 2003 17:11:42 +0200 (CEST) Achim Fritz [EMAIL PROTECTED] wrote: Hallo Erik, erstmal danke fuer Deine ausfuehrliche Beschreibung. leider funktioniert es nicht: oh no (mit 20u gehts) Noch ne Idee? ganz spontan: jeder prozess kann in linux nur 2 gb memory haben. :-) ist dein algorithmus wirklich nicht aufteilbar, brauchst du wirklich die 4 GB gleichzeitig im RAM? MfG Erik -- Erik Thiele -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: integer groesser 2^31 in C
Hallo Achim Das hilft dir jetzt vielleicht nicht knkret weiter, aber wenn du öfter solche Sachen machst, solltest du dir vielleicht mal Fortran anschauen. fuer ein Finite-Element-Programm in C, muesste ich unbedingt mehr als 2Gb Speicher allokieren. Der Rechner hat 2Gb Speicher und 2Gb Swap. Ich habe erst gedacht, es liegt am Kernel (CONFIG_HIGHMEM ist gesetzt), habe jetzt aber festgestellt, dass es nicht moeglich ist in C eine Integer zu deklarieren, die groesser als 2^31 ist. -- Gruß Frank -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: integer groesser 2^31 in C
Hallo, Deine Frage ist in einer C - Gruppe sicherlich besser aufgehoben. Achim Fritz [EMAIL PROTECTED] writes: Hi, fuer ein Finite-Element-Programm in C, muesste ich unbedingt mehr als 2Gb Speicher allokieren. Der Rechner hat 2Gb Speicher und 2Gb Swap. Ich habe erst gedacht, es liegt am Kernel (CONFIG_HIGHMEM ist gesetzt), habe jetzt aber festgestellt, dass es nicht moeglich ist in C eine Integer zu deklarieren, die groesser als 2^31 ist. Bezüglich der Größe von Integertypen macht der C - Standard lediglich folgende Zusicherung: char = short = int = long Die tatsächliche Größe ist Systemabhängig und kann über die Headerdatei limits.h erfragt werden. [EMAIL PROTECTED]:~/ugspeicher/test-proc cat testint.c #include stdlib.h int main(void){ long long int a=22; int b=22; int c=20; printf(a=%d\n,a); Versuch's mal mit printf(a=%lld\n,a); Ein Blick in die manpage von printf erklärt Dir, warum. Wenn Du mit noch größeren Zahlen hantieren mußt, als unsigned long long zu bieten hat, hilft vielleicht eine bignum - library wie libgmp. Ob Du nun aber so große Speicherbereiche allozieren kannst, und ob Dein Programm das wirklich tun muß, bezweifele ich eher. Aber das gehört definitiv in ein anderes Forum. Grüße, Daniel. -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: integer groesser 2^31 in C
Es gibt Compiler, die einen Typ int64 eingebaut haben (VC6 zum Beispiel) und andere, die 64 Bit Zahlen in einer struct LARGE_INTEGER in einer *.h Datei anbieten (z.B. BCB ab v3). Was die verschiedenen GNU Versionen haben weiß ich noch nicht (#if defined( [int64|_int64|o.ä.] ) ... // versuchen). Es ist jedoch leicht, eine Klasse für Operationen mit 64 Bit Zahlen selbst zu bauen oder eine Sammlung Funktionen in C -- nur die Ausgabe per printf ist eine langweilige Fleißarbeit. Auch sind arrays aus 2^31 Bit großen Einzelspeicherbereichen möglich. Gruß, gw PS: Der erste Versuch, diese Antwort zu senden, hatte keinen Erfolg. Wenn jemand meint, das Thema wäre out of topics, hätte die Anfrage nicht veröffentlicht werden dürfen. Achim Fritz wrote: Hi, fuer ein Finite-Element-Programm in C, muesste ich unbedingt mehr als 2Gb Speicher allokieren. Der Rechner hat 2Gb Speicher und 2Gb Swap. Ich habe erst gedacht, es liegt am Kernel (CONFIG_HIGHMEM ist gesetzt), habe jetzt aber festgestellt, dass es nicht moeglich ist in C eine Integer zu deklarieren, die groesser als 2^31 ist. [EMAIL PROTECTED]:~/ugspeicher/test-proc cat testint.c #include stdlib.h int main(void){ long long int a=22; int b=22; int c=20; printf(a=%d\n,a); printf(b=%d\n,b); printf(c=%d\n,c); exit(0); } [EMAIL PROTECTED]:~/ugspeicher/test-proc gcc testint.c testint.c: In function `main': testint.c:4: warning: decimal constant is so large that it is unsigned testint.c:5: warning: decimal constant is so large that it is unsigned [EMAIL PROTECTED]:~/ugspeicher/test-proc ./a.out a=-2094967296 b=-2094967296 c=20 Hab schon mehrere Compiler ausprobiert (unter anderem auch Borland auf Windows) und in den manpage von gcc nach optionen gesucht. (2.4.21 hab ich auch schon getestet) Der Kernel hat auch keine Probleme mit grossen Zahlen: [EMAIL PROTECTED]:~/ugspeicher/test-proc echo 2^31|bc 2147483648 [EMAIL PROTECTED]:~/ugspeicher/test-proc echo 2^32|bc 4294967296 [EMAIL PROTECTED]:~/ugspeicher/test-proc echo 2^100|bc 1267650600228229401496703205376 Und noch was: [EMAIL PROTECTED]:~/ugspeicher/test-proc ulimit -a core file size(blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files(-n) 1024 pipe size (512 bytes, -p) 8 stack size(kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes(-u) 7168 virtual memory(kbytes, -v) unlimited Hat jemand ne Ahnung, oder ne Idee? Gruss Achim -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: integer groesser 2^31 in C
Peter Bartosch wrote: Hi! Hi, fuer ein Finite-Element-Programm in C, muesste ich unbedingt mehr als 2Gb Speicher allokieren. Der Rechner hat 2Gb Speicher und 2Gb Swap. Ich habe erst gedacht, es liegt am Kernel (CONFIG_HIGHMEM ist gesetzt), habe jetzt aber festgestellt, dass es nicht moeglich ist in C eine Integer zu deklarieren, die groesser als 2^31 ist. AFAIK ist int immer Prozessor-Register breite - 32Bit ... Peter Das stimmt nicht. Ich habe einen Compiler auf einer 32 Bit Maschine mit 16 Bit int. Was alle kukünftiger Compiler für 64 (später 128) Bit Prozessoren machen werden, ist auch noch nicht raus, weil da vielleicht sinnvoll wäre, int auf 32 Bit festzuschreiben -- aus dem Sprachenstandard geht das jedenfalls nicht hervor. Wichtiger aber ist, daß das Problem von Achim woanders liegt. Die Frage ist, ob es einen 64 Bit Integer Typ gibt. Den gibt es teilweise oder er wird bei Bedarf halt emuliert mit einer Reihe Funktionen oder einer Klasse -- wie es bei den komplexen Zahlen auch notwendig ist. Bei COM, das es zurecht auch unter Linux gibt, ist das Standard, um die zeitliche Auflösung ausreichend groß zu haben. Grüße, Gerhard -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: integer groesser 2^31 in C
Achim Fritz [EMAIL PROTECTED] writes: [ Probleme mit Zahlen größer 2^31 in C] Du musst natürlich eine long long zuweisen und ausgeben, sonst wird das nichts: int main(void){ long long int a=22; long long int a=22LL; int b=22; int c=20; printf(a=%d\n,a); printf(a=%lld\n,a); printf(b=%d\n,b); printf(c=%d\n,c); exit(0); } Der Kernel hat auch keine Probleme mit grossen Zahlen: [..] [EMAIL PROTECTED]:~/ugspeicher/test-proc echo 2^100|bc 1267650600228229401496703205376 Das ist nicht der Kernel, der da rechnet, sondern bc. Der kann (fast) beliebig große Integers. Gruß, Heike -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)
Re: integer groesser 2^31 in C
Achim Fritz schrieb: fuer ein Finite-Element-Programm in C, muesste ich unbedingt mehr als 2Gb Speicher allokieren. Der Rechner hat 2Gb Speicher und 2Gb Swap. Ohauerha... Ich habe erst gedacht, es liegt am Kernel (CONFIG_HIGHMEM ist gesetzt), habe jetzt aber festgestellt, dass es nicht moeglich ist in C eine Integer zu deklarieren, die groesser als 2^31 ist. Du bist auf eine mögliche Bedeutung von 32-Bit System gestossen. ;) Alles Weitere findest Du in den man-pages, bei Google oder einem C-Buch Deiner Wahl (Programmieren in C von Kernighan+Ritchie war zu meiner Zeit Standard). Jedenfalls hat auch das _nichts_ mit Debian zu tun. cu, Uwe -- Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/ Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED] mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)