Quote:
Originally Posted by alpines
Wäre es nicht möglich alle durchzuprobieren und bei korrekter Ausgabe den Typ festzulegen? Das ist sicherlich nicht effizient oder schnell aber würde doch sicherlich funktionieren oder?
|
Nö, überhaupt nicht.
Das Ganze funktioniert nur bei folgenden Szenarien:
1. Der Wert steht zufällig an der allerletzten Speicherzelle im Ram.
Dann würde es bei einem Wert, der größer als der wirklich genutzte Speicher ist einen Fehler geben.
2. Nur dieser eine Wert hat Read-Rechte und alle Werte in der Umgebung nicht. Dann könnte man testen bei welchem größten Datentyp das Lesen klappt.
Aber wieso geht das sonst nicht?
Die Antwort ist easy, stellen wir uns vor wir haben folgenden Speicher (jede Zeile entsprich genau einem halben BYTE):
| Halbes Byte # | Wert | Binär |
| 1 | 1 | 0001 |
| 2 | 2 | 0010 |
| 3 | 3 | 0011 |
| 4 | 4 | 0100 |
Der Grund wieso man das jetzt nicht erkennen kann ist folgender:
Wenn wir statt einem short (=2 Byte) ein char (=1 Byte) auslesen lassen, dann kriegen wir folgende Zahl zurück:
Lesen wir jetzt aber 2 Byte aus sieht unsere Zahl so aus:
PHP Code:
0001 0010 0011 0100 = 4660
Lesen wir hingegen nur ein halbes Byte aus sieht unsere Zahl so aus:
Alle 3 Zahlen sind existierende Zahlen und wenn das Programm nicht weiß, wie groß diese Zahl ist, dann ist jeder Datentyp eine mögliche echte Zahl, auch der halbbyte Datentyp, auch wenn der so gar nicht existiert.
Vondaher ist es nicht möglich, ohne Vorwissen, den Datentyp komplett automatisch bestimmen zu lassen. Zumindest nicht ohne das Programm o.ä. zusätzlich analysieren zu lassen. Alleine durch die Adresse/den Pointer ist der Datentyp nicht festgelegt.