Re: integer groesser 2^31 in C

2003-07-01 Diskussionsfäden Bertram Scharpf
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

2003-06-30 Diskussionsfäden Peter Bartosch
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

2003-06-30 Diskussionsfäden Erik Thiele
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

2003-06-30 Diskussionsfäden Weinzierl Stefan
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

2003-06-30 Diskussionsfäden Achim Fritz


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

2003-06-30 Diskussionsfäden Gerhard Wolfstieg
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

2003-06-30 Diskussionsfäden Philipp Meier
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

2003-06-30 Diskussionsfäden Erik Thiele
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

2003-06-30 Diskussionsfäden Frank Evers


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

2003-06-30 Diskussionsfäden Daniel Hofmann
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

2003-06-30 Diskussionsfäden Gerhard Wolfstieg
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

2003-06-30 Diskussionsfäden Gerhard Wolfstieg
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

2003-06-30 Diskussionsfäden Heike C. Zimmerer
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

2003-06-30 Diskussionsfäden Uwe Laverenz
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)