Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋼) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hallo zusammen,

ich habe ein Problem mit der folgenden Aufgabe.

Wir sollten in der Schule schreiben was Zahl ausgibt. Ich weiss

das 2585 das Ergebniss ist. Aber ich kann den Weg nicht nachvollziehen.

Unser Lehrer hatte nur noch 25+10*256 an die Tafel

geschrieben und war verschwunden.

Vielleicht kann mir jemand mal den Weg erklÀren wie

man auf dieses Ergebniss kommt.

Thx :D

unsigned char z1=10, z2=25;

unsigned char*p;

short Zahl=0;

p=(unsigned char*) &Zahl;

*p=z2;

p++;

*p=z1;

cout << Zahl;

Hallo,

Der Code ist mehr als riskant! z1 und z2 mĂŒssen nicht notwendigerweise hintereinander im Speicher liegen!! Zum einen greifst Du auf nicht allokierten Speicher zu und zum anderen ist das Speicherlayout maschinen-abhĂ€ngig. Ein HP liefert beispielsweise ein ganz anderes Ergebnis!! Kein gutes Beispiel, da der Code fehlerhaft ist.

Nic

Das mag gut sein das das ein schlechtes Beispiel ist!

:D Hab die Aufgabe aber genau so in schriftlicher Form erhalten

und sollte dann aus dem Quelltext erkennen können das 2585

als Ergebniss rauskommt.

Wie zum Geier ist der darauf gekommen ???? Das ganze war ein Test

und ich kann mich erinnern das aus der ganzen Klasse das nur einer hatte.

Hmm.... :confused:

Hallo,

Das Ergebnis Deines Lehrers leider ist falsch.

10 und 25 liegen hintereinander im Speicher, der Zeiger zeigt auf die 25 (das low-order Byte einer 16 Bit-Zahl). Wird der Zeiger um eine Stelle verschoben, so zeigt er auf auf den Anfang der 16 Bit Zahl. Das Highorder-Byte dieser 16 Bit Zahl ist 10, folglich berechnet sich die 16-Bit Zahl als 10*256+25=2585. Problem ist allerdings, dass es Maschinen mit unterschiedlicher Byte-Order gibt (er geht von einer Intel-Archtektur aus). Bei umgekehrter Byte-Order wird 25*256+10=6410 berechnet (da das Low-Oder und High-Order Byte vertauscht sind).

Der zweite Fehler ist die Tatsache, dass der Pointer erhöht wird, jedoch auf kein Array zeigt. Aus dem Grund kann man bei dieser Pointer-Operation auch irgendwo im Nirwana landen (obwohl dies unwahrscheinlich ist, da z1 und z2 in der Regel in aufeinanderfolgenden Speicherstellen abgespeichert werden).

Nic

unsigned char z1=10, z2=25;

unsigned char*p;

short Zahl=0;

p=(unsigned char*) &Zahl;

*p=z2;

p++;

*p=z1;

cout << Zahl;

Der Code ist zulĂ€ssig und wird immer funktionieren, wenn ein short doppelt so groß ist wie ein char. (Im unteren Text gehe ich davon aus: sizeof(char) = 1, sizeof(short) = 2)

Mit *p=z2; p++; *p=z1; werden die untern 8bit, dann die oberen 8 bit gesetzt. Auf einem x86 System steht das "least significant byte" (a.k.a Little-Endian) einer Integer-Variable immer an der niedrigsten Speicheradresse, daher ist das Ergebnis 256*25+10 = 6410. Hingegen auf Big-Endian (z.b: PowerPC) Systemen steht das "least significant byte" an der höchsten Speicheradresse und das Ergbnis wÀre daher: 256*10+25 = 2825

Die Angabe ist ansich nicht vollstÀndig. Weiters ist rate ich davon dringend ab, Konstrukte solcher Art in irgendwelchen Programmen zu verwenden, da sie nicht plattformunabhÀngig sind. Nur in seltenen FÀllen, z.b. Hardware-Programmierung sind solche Methoden zulÀssig.

MfG, Michael

Hallo,

stimmt, den cast hatte ich ĂŒbersehen. Zumindest die Pointer-Arithmetik ist damit zulĂ€ssig.

Allerdings hast Du die Ergebnisse vertauscht. Eine Little Endian Maschine liefert 2825, eine Big-Endian Maschine 6410 (siehe auch oben). Eine Intel (ia32)-Architektur ist Little Endian und liefert daher 2825. Das kannst Du leicht ĂŒberprĂŒfen, in dem Du den Code einfach mal ĂŒbersetzt und ausfĂŒhrst.

Bei Big Endian Architekturen steht das LSB am Ende bzw. das MSB am Anfang eines Wortes ("Big End First").

Das ist ĂŒbrigens auch der Grund dafĂŒr, warum man fĂŒr Socket-Kommunikationen grundsĂ€tzliche die Funktionen htons/ntohs bzw. htonl/ntonl ("Host-To-Network-Byteorder"/"Network-To-Host-Byteorder" fĂŒr short und long) verwenden muss.

Nic

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.