Variablentyp selber definieren
Re: Variablentyp selber definieren
Ist das bei diesen uin32_t auch so?
mfg
Empire
mfg
Empire
- Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Re: Variablentyp selber definieren
Ja, das gilt für alle Integer-Datentypen.
In welcher Reihenfolge (von "vorne" oder von "hinten") die Zahlen aus den einzelnen Bytes zusammengesetzt sind hängt wie gesagt vom System ab.
Damit meine ich nicht das Betriebssystem, sondern das System in der Hardwaretechnischen Bedeutung.
Es hängt also davon ab, welchen Typ CPU du z.B. verwendest.
"PC"-Systeme verwenden in der Regel Little Endian, andere Architekturen wie z.B. PowerPC, MIPS, SPARC und soweit ich weiß auch viele Kleingeräte (wie Handys) verwenden hingegen Big Endian.
Die Network-Byte-Oder ist Big Endian.
Auf deinem "normalen" PC musst du also die Byte-Order konvertieren.
Und zwar auch bei int32_t ähnlichen Datentypen.
Denn diese Schreiben nur vor:
- ob der Datentyp ein Vorzeichen hat oder nicht
- dass der Datentyp eine ganze Zahl enthält
- dass der Datentyp aus 4 Bytes besteht
Damit ist aber eben nicht die Reihenfolge, in der diese 4 Bytes gelesen werden festgelegt.
Theoretisch könntest du dir solche Byte-Order-Konvertierungsfunktionen auch selbst schreiben.
Eine gute Übung wäre es
In welcher Reihenfolge (von "vorne" oder von "hinten") die Zahlen aus den einzelnen Bytes zusammengesetzt sind hängt wie gesagt vom System ab.
Damit meine ich nicht das Betriebssystem, sondern das System in der Hardwaretechnischen Bedeutung.
Es hängt also davon ab, welchen Typ CPU du z.B. verwendest.
"PC"-Systeme verwenden in der Regel Little Endian, andere Architekturen wie z.B. PowerPC, MIPS, SPARC und soweit ich weiß auch viele Kleingeräte (wie Handys) verwenden hingegen Big Endian.
Die Network-Byte-Oder ist Big Endian.
Auf deinem "normalen" PC musst du also die Byte-Order konvertieren.
Und zwar auch bei int32_t ähnlichen Datentypen.
Denn diese Schreiben nur vor:
- ob der Datentyp ein Vorzeichen hat oder nicht
- dass der Datentyp eine ganze Zahl enthält
- dass der Datentyp aus 4 Bytes besteht
Damit ist aber eben nicht die Reihenfolge, in der diese 4 Bytes gelesen werden festgelegt.
Theoretisch könntest du dir solche Byte-Order-Konvertierungsfunktionen auch selbst schreiben.
Eine gute Übung wäre es

Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne!
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.
Ich helfe gerne!

----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.
Re: Variablentyp selber definieren
Ich glaube mich zu erinnern irgend wo gelesen zu haben das es möglich ist variablen Bit weise zu schreiben, stimmt das?
Oder waren das Text Document?
mfg
Empire
Oder waren das Text Document?
mfg
Empire
- Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Re: Variablentyp selber definieren
Wie meinst du das, "Variablen bitweise schreiben" ?
Allgemein kannst du bei einem Computer immer nur auf ein Byte zugreifen, nicht auf eine kleinere Einheit.
Das Byte ist deshalb auch als die kleinste, adressierbare Informationseinheit festgelegt.
Du kannst natürlich von diesem einen Byte dann nur ein Bit betrachten und bearbeiten
Ansonsten müsstest du genauer erklären, was du meinst.
Allgemein kannst du bei einem Computer immer nur auf ein Byte zugreifen, nicht auf eine kleinere Einheit.
Das Byte ist deshalb auch als die kleinste, adressierbare Informationseinheit festgelegt.
Du kannst natürlich von diesem einen Byte dann nur ein Bit betrachten und bearbeiten

Ansonsten müsstest du genauer erklären, was du meinst.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne!
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.
Ich helfe gerne!

----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Variablentyp selber definieren
Du kannst ein Integer zu einer Bit-Struktur machen und dann auf die einzelnen Bits zugreifen:Empire hat geschrieben:Ich glaube mich zu erinnern irgend wo gelesen zu haben das es möglich ist variablen Bit weise zu schreiben, stimmt das?
Oder waren das Text Document?
Code: Alles auswählen
struct BitMuster
{
unsigned int ZweiBitBreit : 2;
unsigned int VierBitBreit : 4;
unsigned int Bool1 : 1;
unsigned int Bool2 : 1;
};
Wie beschrieben musst Du ein BigEndian 4321 in ein LittleEndian 1234 transformieren. Du nimmst also die linken 8 Bit und vertauschst sie mit den Rechten usw.
Code: Alles auswählen
unsigned int bigEndian = 0x04030201;
unsigned int littleEndian = ((unsigned char*)&bigEndian)[3] | ((unsigned char*)&bigEndian)[2] <<8 | ((unsigned char*)&bigEndian)[1] <<16 |((unsigned char*)&bigEndian)[0] << 24;
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Variablentyp selber definieren
Ich weis das war noch ein anderer Geistesblitz(den ich inzwischen nicht mal mehr nachvollziehen kann)
Re: Variablentyp selber definieren
Da fällt mir auf:
Es ist sehr praktisch zu wissen wie ich die umwandel aber woher weis ich wie rum das System die Variable braucht??
Muss ich das den User testen lassen?
mfg
Empire
Es ist sehr praktisch zu wissen wie ich die umwandel aber woher weis ich wie rum das System die Variable braucht??
Muss ich das den User testen lassen?
mfg
Empire
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Variablentyp selber definieren
Nun, zum einen kannst Du das beim kompilieren festlegen - schließlich ändert sich das ja nicht mehr, wenn es erstmal kompiliert ist.Empire hat geschrieben:Da fällt mir auf:
Es ist sehr praktisch zu wissen wie ich die umwandel aber woher weis ich wie rum das System die Variable braucht??
Muss ich das den User testen lassen?
Und Du kannst es herausfinden:
Code: Alles auswählen
int integer = 1;
bool littleEndian = ( (unsigned int*)&integer )[0] ) != 0; // Intel speichert die kleinsten Werte am vorderen "Ende"
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Variablentyp selber definieren
char ist davon aber nicht betroffen oder?
Nein ich will int nicht in char stecken zum verschicken aber bei einem Chat brauch ich halt char.
mfg
Empire
Nein ich will int nicht in char stecken zum verschicken aber bei einem Chat brauch ich halt char.
mfg
Empire
- Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Re: Variablentyp selber definieren
Also es wird definitiv beim kompilieren festgelegt.
Nur einen wirklichen DEFINE-SWITCH dafür scheint es nicht zu geben.
Sprich du musst es testen:
Die zwei unterschiedlichen Mid Endian Varianten kann man eigentlich vernachlässigen, sind hier aber nur der Vollständigkeit halber aufgeführt. Die Bezeichnungen der beiden hab ich mal so gewählt.
Ein char besteht nur aus einem Byte. Das kannst du folglich nicht anders anwenden
Nur einen wirklichen DEFINE-SWITCH dafür scheint es nicht zu geben.
Sprich du musst es testen:
Code: Alles auswählen
#include <stdio.h>
const char ENDIANNESS_BIG = 1;
const char ENDIANNESS_LITTLE = 2;
const char ENDIANNESS_MID_BIG = 4;
const char ENDIANNESS_MID_LITTLE = 8;
char ENDIANNESS = 0;
void test_endianness()
{
const int __testcaseint = 0xAABBCCDD;
unsigned char* __testcasearray = (char*)&__testcaseint;
if (__testcasearray[3] == 0xAA) ENDIANNESS = ENDIANNESS_LITTLE;
else if (__testcasearray[0] == 0xAA) ENDIANNESS = ENDIANNESS_BIG;
else if (__testcasearray[1] == 0xAA) ENDIANNESS = ENDIANNESS_MID_LITTLE;
else if (__testcasearray[2] == 0xAA) ENDIANNESS = ENDIANNESS_MID_BIG;
else ENDIANNESS = 0;
}
int main(int argc, char** argv)
{
test_endianness();
printf("The endianness of the compile system is %d (",ENDIANNESS);
if (ENDIANNESS == ENDIANNESS_BIG) printf("Big Endian, 0xAABBCCDD");
else if (ENDIANNESS == ENDIANNESS_LITTLE) printf("Little Endian, 0xDDCCBBAA");
else if (ENDIANNESS == ENDIANNESS_MID_LITTLE) printf("Mid Endian/Little like, 0xBBAADDCC");
else if (ENDIANNESS == ENDIANNESS_MID_BIG) printf("Mid Endian/Big like, 0xCCDDAABB");
else printf("unknown or untested");
printf(")\n");
return 0;
}
Ein char besteht nur aus einem Byte. Das kannst du folglich nicht anders anwenden

Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne!
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.
Ich helfe gerne!

----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.