Gast
#6261519
Ist das hier normal? Laut meinem Lehrbuch steht folgendes:
1 | |
2 | |
3 | |
4 | |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
|
Anzeige
|
Pointer Größe nur 4 Byte bei 64 Bit Betriebssystem
Gast
#6261519
Ist das hier normal? Laut meinem Lehrbuch steht folgendes:
Wie/womit hast du das compiliert?
Gast
#6261532
Simon schrieb: > printf("Groesse von ptr = %d", sizeof(ptr)); probiere mal mit
Gast
#6261536
Tja, das zeigt dir, dass entweder dein Rechner eine 32-Bit CPU hat oder eine 64-Bit CPU, die im 32-Bit-Modus läuft. Viele 64-Bit CPUs (insb alle x86) können auch, so es das Betriebssystem unterstützt (Win tut es), auch in einem 32-Bit Modus betrieben werden.
Gast
#6261546
foobar schrieb: > Tja, das zeigt dir, dass entweder dein Rechner eine 32-Bit CPU hat > oder > eine 64-Bit CPU, die im 32-Bit-Modus läuft. Stimmt nicht. Es zeigt, dass der Compiler den Source Code für ein 32 bit System compiliert. Welche CPU der Rechner auf dem compiliert wird hat oder welche CPU das System später haben wird, auf dem das Programm läuft, spielt hier keine Rolle.
Gast
#6261554
Simon schrieb: > Auf einer 32-Bit Rechnerarchitektur 4, auf einer 64-Bit > Rechnerarchitektur 8 Bytes. ein 32Bit Programm kann nicht magisch 64Bit Speicher adressieren
Gast
#6261556
Bobby X schrieb: > Welche CPU der Rechner auf dem compiliert wird hat oder > welche CPU das System später haben wird, auf dem das Programm läuft, > spielt hier keine Rolle. Korrekt. Genauer gesagt, ersetzt der Compiler Ausdrücke der Form "sizeof XY" beim Kompilieren mit einer Konstanten. In der Programmdatei steht da also fest 4, 8, oder was auch immer. Sofern die CPU und OS das Programm mit oder ohne Kompatibilitätsmodus ausführen können, ist die Ausgabe also immer die selbe. Da ist keine dynamische Abfrage drin. Simon schrieb: > Ist das hier normal? Laut meinem Lehrbuch steht folgendes: Was ist das denn für ein Compiler, wo hast du den her? In Lehrbüchern wird gerne mal antike Software genutzt, welche z.B. kein 64bit kennt. Simon schrieb: > printf("Groesse von ptr = %d", sizeof(ptr)); Das ist übrigens falsch, es muss "%zu" sein und nicht "%d", denn "sizeof" gibt den Typ "size_t" zurück, welcher (insb. eben bei 64bit-Systemen) größer als "int" sein kann, und "%d" erwartet "int". Für size_t daher "%zu". Dein Lehrbuch scheint also nicht sehr gut zu sein.
Gast
#6261686
Warum muss eine 64bit CPU auch einen 64bit Adressraum haben? Oder ein warum sollte sie.
Gast
#6261731
A. S. schrieb: > Oder ein warum sollte sie. weil es öfters so ist?
Gast
#6261807
Simon schrieb: > Wird der Operator sizeof > auf ein Feld angewendet (sizeof(feld)), erhält man den Speicherverbrauch > des Feldes in Bytes. Das ist so nicht ganz korrekt, sizeof gibt dir den Speicherverbrauch des Feldes als Vielfaches von char. Der C-Standard iso9899:1999 garantiert dir das sizeof(char) == 1 ist. Er garantiert dir aber nicht das char immer exakt ein Byte hat. (Auch wenn es in der Praxis wohl bei 95% aller Systemen so ist) streng genommen könnten es auch 2 Bytes sein oder 5. Simon schrieb: > Rechnerarchitektur benötigt werden.Auf einer 32-Bit Rechnerarchitektur > 4, auf einer 64-Bit Rechnerarchitektur 8 Bytes. Hast du das Programm einmal für 32 Bit kompiliert & einmal für 64 Bit. Die meisten modernen 64 Bit Maschinen können auch 32 Bit Programme ausführen und weil sizeof(ptr) beim Kompilieren bekannt ist, wird der Compiler das Evaluieren und fest in Binary schreiben und nicht zu Laufzeit berechnen.
Gast
#6261817
Imonbln schrieb: > Er garantiert dir aber nicht das char immer exakt ein Byte hat Doch! Im Standard ist 1 char = 1 Byte fest definiert. Allerdings ist die Anzahl Bits in einem byte nicht unbedingt 8, sondern kann auch größer sein.
Gast
#6261838
A. S. schrieb: > Warum muss eine 64bit CPU auch einen 64bit Adressraum haben? Was genau heisst "haben"? Logischer und physikalischer Adressraum sind nicht dasselbe. Georg Simon schrieb: > Auf einer 32-Bit Rechnerarchitektur 4, auf einer 64-Bit Rechnerarchitektur 8 > Bytes. So allgemein kann man das nicht sagen. Aber in der Regel ist es so. Bobby X schrieb: > foobar schrieb: >> Tja, das zeigt dir, dass entweder dein Rechner eine 32-Bit CPU hat >> oder eine 64-Bit CPU, die im 32-Bit-Modus läuft. > > Stimmt nicht. > Es zeigt, dass der Compiler den Source Code für ein 32 bit System > compiliert. Und zur Ausführung des Programms wird der Prozessor vorübergehend in den 32-Bit-Modus geschaltet. > Welche CPU der Rechner auf dem compiliert wird hat oder welche CPU das > System später haben wird, auf dem das Programm läuft, spielt hier keine > Rolle. Nun, auf einer 32-Bit-Architektur wird ein 64-Bit-Programm nicht laufen; auf einer 64-Bit-Architektur läuft ein 32-Bit-Programm nur, wenn das sowohl die Hardware, als auch das Betriebssystem das unterstützt Von daher spielt es offenbar sehr wohl eine Rolle. A. S. schrieb: > Warum muss eine 64bit CPU auch einen 64bit Adressraum haben? Sie muss nicht. Aber kennst du eine gängige CPU-Architektur, bei der das nicht so ist? > Oder ein warum sollte sie. Das wird im allgemeinen als der größte Vorteil von 64-Bit-Architekturen gesehen. Der größere Adressraum ist der Hauptgrund, weshalb man PCs auf 64 Bit umgestellt hat, weshalb man inzwischen auch schon die Handys auf 64 Bit umgestellt. Imonbln schrieb: > Simon schrieb: >> Wird der Operator sizeof >> auf ein Feld angewendet (sizeof(feld)), erhält man den Speicherverbrauch >> des Feldes in Bytes. > > Das ist so nicht ganz korrekt, Doch, das ist absolut korrekt. > sizeof gibt dir den Speicherverbrauch des Feldes als Vielfaches von char. > Der C-Standard iso9899:1999 garantiert dir das sizeof(char) == 1 ist. Er > garantiert dir aber nicht das char immer exakt ein Byte hat. Doch, tut er - explizt. Er garantiert dir nur nicht, dass ein Byte genau 8 Bit hat. Ein Byte darf auch 9 oder 12 oder 32 Bit breit sein, es darf nur nicht kleiner als 8 Bit sein.
Gast
#6262265
Rolf M. schrieb: > Bobby X schrieb: >> foobar schrieb: >>> Tja, das zeigt dir, dass entweder dein Rechner eine 32-Bit CPU hat >>> oder eine 64-Bit CPU, die im 32-Bit-Modus läuft. >> >> Stimmt nicht. >> Es zeigt, dass der Compiler den Source Code für ein 32 bit System >> compiliert. > > Und zur Ausführung des Programms wird der Prozessor vorübergehend in den > 32-Bit-Modus geschaltet. > >> Welche CPU der Rechner auf dem compiliert wird hat oder welche CPU das >> System später haben wird, auf dem das Programm läuft, spielt hier keine >> Rolle. > > Nun, auf einer 32-Bit-Architektur wird ein 64-Bit-Programm nicht laufen; > auf einer 64-Bit-Architektur läuft ein 32-Bit-Programm nur, wenn das > sowohl die Hardware, als auch das Betriebssystem das unterstützt Von > daher spielt es offenbar sehr wohl eine Rolle. Die Programmiersprache, C in diesem Fall, "weiss nicht" auf welcher Platform, CPU usw.... das in ihr geschriebene Programm laufen wird. Die Programmiersprache selbst und ihre Implementierung/Ausführungsbedinungen auf jeweiligen Platformen sind zwei verschiedene Dinge. Ähnlich ist es mit den calling convention. Das was in C ein Funktionsaufruf ist, kann auf verschiedene Art und weise realisiert werden. Aus Sicht von C ist das aber stets "nur" ein Funktionsaufruf. Bobby X schrieb: >> Nun, auf einer 32-Bit-Architektur wird ein 64-Bit-Programm nicht laufen; >> auf einer 64-Bit-Architektur läuft ein 32-Bit-Programm nur, wenn das >> sowohl die Hardware, als auch das Betriebssystem das unterstützt Von >> daher spielt es offenbar sehr wohl eine Rolle. > > Die Programmiersprache, C in diesem Fall, "weiss nicht" auf welcher > Platform, CPU usw.... das in ihr geschriebene Programm laufen wird. Natürlich nicht, aber worauf willst du hinaus? Es geht hier um die Ausgabe, die ein für eine spezifische Plattform generiertes Programm bei seiner Ausführung produziert hat. Dort war die Größe eines Zeigers 4 statt der erwarteten 8 Bytes. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|