Seite 1 von 2
Ist ein Char immer 1 Byte breit?
Verfasst: Mi Okt 26, 2011 9:19 pm
von Bebu
Hallo zusammen,
ich schreibe wieder mal an Dedupe und baue gerade einen Unittest dafür. Ich will eine Zufallsdatei erzeugen lassen und zwar auf das Byte exakt. Wenn ein Char immer und überall genau ein Byte breit ist, dann kann ich es so durchführen, wie ich will, sonst bin ich offen für Alternativvorschläge
Re: Ist ein Char immer 1 Byte breit?
Verfasst: Mi Okt 26, 2011 9:33 pm
von Xin
Bebu hat geschrieben:Hallo zusammen,
ich schreibe wieder mal an Dedupe und baue gerade einen Unittest dafür. Ich will eine Zufallsdatei erzeugen lassen und zwar auf das Byte exakt. Wenn ein Char immer und überall genau ein Byte breit ist, dann kann ich es so durchführen, wie ich will, sonst bin ich offen für Alternativvorschläge
In C ist ein Char
mindestens 1 Byte groß.
Ein Byte hat
mindestens 8 Bit.
Vielleicht hilft das:
Ein char ist
immer genau sizeof( char ) Bytes groß.
Auf einem aktuellen System kannst Du davon ausgehen, dass ein char 1 Byte groß, alleine schon, weil aktuelle Systeme Byteweise adressieren und es keinen anderen "byte"-Datentyp gibt.
Re: Ist ein Char immer 1 Byte breit?
Verfasst: So Okt 30, 2011 11:56 am
von oenone
wieviel Bit ein Char (und damit ein Byte) hat, bekommst du aus limit.h mit dem Macro CHAR_BIT.
Re: Ist ein Char immer 1 Byte breit?
Verfasst: So Okt 30, 2011 1:19 pm
von cloidnerux
(und damit ein Byte)
Ein Byte ist auf allen Computern der letzten 20 Jahre 8 Bit breit.
Re: Ist ein Char immer 1 Byte breit?
Verfasst: Mo Okt 31, 2011 12:49 pm
von Bebu
Vielen Dank, es geht mir darum, das ich die Garantie habe, das 1 Char immer ein Byte belegt, wenn ich es in eine Datei schreibe. Allerdings habe ich mir überlegt, einfach einen Unittest dafür einzufügen, sozusagen als Selbsttest, ob die Umgebungsbedingungen wie erwartet sind. Wenn nicht, dann schlägt der Test auf diesem System halt fehl. Wenn er auf allen anderen Systemen funktioniert und nur auf einem exotischen eventuell nicht, dann ist das ziemlich unwichtig oder Zeit für eine Portierung.
Re: Ist ein Char immer 1 Byte breit?
Verfasst: Mo Okt 31, 2011 12:56 pm
von Xin
Bebu hat geschrieben:Vielen Dank, es geht mir darum, das ich die Garantie habe, das 1 Char immer ein Byte belegt, wenn ich es in eine Datei schreibe. Allerdings habe ich mir überlegt, einfach einen Unittest dafür einzufügen, sozusagen als Selbsttest, ob die Umgebungsbedingungen wie erwartet sind. Wenn nicht, dann schlägt der Test auf diesem System halt fehl. Wenn er auf allen anderen Systemen funktioniert und nur auf einem exotischen eventuell nicht, dann ist das ziemlich unwichtig oder Zeit für eine Portierung.
Wenn Du prüfen willst, dass Du auf einem 8-Bit/Byte-Rechner bist, kannst Du auf CHAR_BIT == 8 prüfen und sizeof( char ) == 1.
Der Test wird vermutlich nirgendwo mehr fehlschlagen.
Re: Ist ein Char immer 1 Byte breit?
Verfasst: Mo Okt 31, 2011 1:56 pm
von fat-lobyte
Bebu hat geschrieben:Vielen Dank, es geht mir darum, das ich die Garantie habe, das 1 Char immer ein Byte belegt, wenn ich es in eine Datei schreibe. Allerdings habe ich mir überlegt, einfach einen Unittest dafür einzufügen, sozusagen als Selbsttest, ob die Umgebungsbedingungen wie erwartet sind. Wenn nicht, dann schlägt der Test auf diesem System halt fehl. Wenn er auf allen anderen Systemen funktioniert und nur auf einem exotischen eventuell nicht, dann ist das ziemlich unwichtig oder Zeit für eine Portierung.
Du brauchst dir heutzugage glaube ich keine sorgen mehr machen.
Wenn du es doch tust, könntest du "int8_t" aus <cstdint> verwenden, wenn du C++0x verwendest oder <boost/cstdint.hpp>, wenn du Boost verwendest. Leider ist der int8_t typ nicht garantiert auf jeder Plattform. Dafür allerdings der int_least8_t, der mindestestens 8 bit enthält.
Re: Ist ein Char immer 1 Byte breit?
Verfasst: Mo Okt 31, 2011 1:59 pm
von Xin
fat-lobyte hat geschrieben:Wenn du es doch tust, könntest du "int8_t" aus <cstdint> verwenden, wenn du C++0x verwendest oder <boost/cstdint.hpp>, wenn du Boost verwendest. Leider ist der int8_t typ nicht garantiert auf jeder Plattform. Dafür allerdings der int_least8_t, der mindestestens 8 bit enthält.
int_least8_t entspricht damit char, welcher ebenfalls mindestens 8 Bit enthält.
int8_t ist vermutlich auf Plattformen nicht verfügbar, die mindestens 9 Bit pro Byte haben, also ist der Test nicht durchführbar.
Ich würde Boost hier raushalten. Wozu Abhängigkeiten aufbauen, die einen nicht weiterbringen?
Re: Ist ein Char immer 1 Byte breit?
Verfasst: Mo Okt 31, 2011 7:56 pm
von naums
Ein char ist von der Sache her 8 bit = 1 Byte groß. Wenn du mehr Zeichen brauchst nimmste Unicode, und brauchst die windows.h (somit funktioniert das nur unter Windows, jedenfalls soweit mir bekannt ist) Dort drinnen gibts nen Typ der sich wchar_t nennt, ist 16 bit groß und damit kannst du (fast) jedes Zeichen darstellen, brauchst aber wiederum andere Funktionen als nur printf().
MfG Naums
Re: Ist ein Char immer 1 Byte breit?
Verfasst: Mo Okt 31, 2011 8:01 pm
von cloidnerux
Ein char ist von der Sache her 8 bit = 1 Byte groß. Wenn du mehr Zeichen brauchst nimmste Unicode, und brauchst die windows.h (somit funktioniert das nur unter Windows, jedenfalls soweit mir bekannt ist)
Die Debatte hier ging nicht direkt über Zeichen und ihre Speicherung, sondern um das allgemeine Problem der Größe einer Variablen, vor allem im Zusammenhang mit dem Auslesen von Dateien, die exakte Feldbreiten benötigen.
Unicode Zeichen sind auch in anderen libs als der WinAPI gegeben, darunter Boost, GTK, Qt, etc.
Auch wie der Name schon sagt, wchar_t ist nur ein typedef, also nur eine Umbenennung eines unsigned short oder ähnlichem.