Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » casting bei pointern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
25.10.2008, 20:41 Uhr
~face
Gast


Hallo,


C++:
const char *s=...;
(unsigned long long int*)s


Dieses Codestück übersteigt (zumindest um diese Uhrzeit ^^) mein Vorstellungsvermögen.

Ich hab versucht das im Debugger nachzuvollziehen, aber der verwirrt mich eher noch mehr. Ich weiße *s an Stelle der Pünktchen also was zu, sodass s auf den string "44025722" zeigt, um mal ein konkretes Beispiel zu nennen.

Was passiert den jetzt genau (im Speicher?) wenn ich im Zeile zwei nach unsigned long long caste? Wenn ich per Breakpoint in der Zeile halte und mit der Maus über den gesamten Ausdruck fahre, zeigt er mir als Inhalt auf einmal die Zahl 842019892 an. Wo kommt die her?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.10.2008, 02:35 Uhr
0xdeadbeef
Gott
(Operator)


Das ist die Speicheradresse, an der sich die Konstante "44025722" befindet.

Im Speicher (oder überhaupt zur Laufzeit) macht Casten rein gar nichts. Es ist bloß eine Art, dem Compiler zu sagen "Ja, ich weiß, dass das wie völliger Blödsinn aussieht, mach's aber trotzdem; ich weiß schon, was ich tue."
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.10.2008, 09:27 Uhr
~face
Gast


Wirklich?

Die Speicheradresse bekomme ich nämlich so angezeigt, wenn ich die Maus drüberfahre. Sie wird als hex angezeigt und ist in beiden Ausdrücken gleich. Nur wenn ich im zweiten Ausdruck noch das + aufklappe (Visual Studio), dann erscheint diese Zahl.

Es sieht also folgendermaßen aus:

+ (unsigned long long int*)s 0x0033633a
842019892
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.10.2008, 12:22 Uhr
0xdeadbeef
Gott
(Operator)


Ach sorum. Ne, dann ist ist das (unter der Annahme, dass unsigned long long auf deinem System 64 bit breit ist) "44025722" als Bitmuster in einen unsigned long long gequetscht und als Zahl aufgefasst.

Lies dir am besten http://de.wikipedia.org/wiki/Byte-Reihenfolge durch, ich vermute, dass das die meisten deiner Fragen bereits beantwortet.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
26.10.2008, 14:11 Uhr
~face
Gast


ja genau, so hab ich das auch verstanden und wollte es zur Überprüfung und fürs Verständnis mal nachrechnen, aber ich komme irgendwie nicht drauf.

Ich hab also die Zeichenkette als Bytemuster aufgeschrieben, also 52, 52, 48, 50, 53, 55, 50, 50, 0 und jetzt muss ich wegen little-endian hinten mit 0 anfangen, ein byte nach links schieben, 50 dazuaddieren, ein byte nach links schieben, etc.

Da kommt aber eine viel größere Zahl raus.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
26.10.2008, 15:39 Uhr
0xdeadbeef
Gott
(Operator)


Die 0 ist das neunte Byte und zählt in der 8-byte-Variable deshalb nicht mehr mit.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
26.10.2008, 19:56 Uhr
~face
Gast


achso, ich dachte es werden die ersten 8, also byte 0 bis das vorletzte byte 52 in einen ull geschrieben. D.h. im ersten liegt somit 50, 50,...52, 52 und im zweiten nur 0?

Trotzdem ist auch (((50<<8)+50)<<8)+55... viel größer als diese Zahl.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
27.10.2008, 01:45 Uhr
0xdeadbeef
Gott
(Operator)


Hmm. Ja, das ist richtig, ein 64-bit-uint hält da 3617014152346743860. Scheinbar interpretiert der Debugger das als 32-bit-Int, ich kriege hier mit

C++:
#include <inttypes.h>
#include <stdio.h>
#include <stdint.h>

int main(void) {
  char const *const s = "44025722";

  uint64_t *p = (uint64_t*) s;

  printf("%" PRIu64 "\n", *p);
  printf("%" PRIu32 "\n", *p);

  for(int i = 0; i < 8; ++i) {
    printf("%" PRId8 " ", s[i]);
  }
  puts("");

  return 0;
}


folgende Ausgabe:

Code:
3617014152346743860
842019892
52 52 48 50 53 55 50 50


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
27.10.2008, 03:01 Uhr
Hans
Library Walker
(Operator)


@Beefy: Mit was für'n Compiler hast Du das übersetzt?
Mein derzeit verwendeter Open Watcom 1.7 mag das Programm jedenfalls nicht.

Zitat von Compilermeldungen:

grozahl.c(19): Error! E1063: Missing operand
grozahl.c(19): Warning! W111: Meaningless use of an expression
grozahl.c(19): Error! E1009: Expecting ';' but found 'int'
grozahl.c(19): Error! E1063: Missing operand
grozahl.c(19): Error! E1009: Expecting ';' but found 'int'
grozahl.c(19): Error! E1063: Missing operand
grozahl.c(19): Warning! W111: Meaningless use of an expression
grozahl.c(19): Error! E1009: Expecting ')' but found 'int'
grozahl.c(19): Error! E1011: Symbol 'i' has not been declared
grozahl.c(19): Warning! W111: Meaningless use of an expression
grozahl.c(19): Error! E1009: Expecting ';' but found ')'


Die Zeilennummer (19) bezieht sich dabei auf die Schleife; - hab ein paar Kommentarzeilen an den Anfang gesetzt.

(Ach ja, mit dem alten Borlandcompiler versuch ich es erst gar nicht, der hat wahrscheinlich noch mehr zu meckern. )

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
27.10.2008, 03:23 Uhr
0xdeadbeef
Gott
(Operator)


gcc 4.3 mit -std=c99. Ich seh's irgendwie nicht mehr ein, 2008 noch C90 zu schreiben.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 27.10.2008 um 03:23 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: