@ Ben charist notwendigerweise ein Byte. Es ist nur so, dass ein Byte nicht unbedingt 8 Bit ist.
Avidan Borisov
4
@ Ben: Sie sind anscheinend nicht mit den exotischeren Plattformen vertraut, die es gibt. Ein Byte ist sicherlich nicht als 8 Bit definiert, unabhängig davon, dass 8 Bit-Bytes vorherrschen. Deshalb haben wir CHAR_BIT. Ich habe an mehr als einem eingebetteten System gearbeitet, bei dem Bytes nicht 8 Bit lang sind. Ein Zeichen hat eine Größe von 1, also ist ein Zeichen immer ein Byte.
Ed S.
11
@Ben: Die C- und C ++ - Standards definieren ein "Byte" eindeutig als die Größe von a char, die mindestens 8 Bit beträgt . Der Begriff "Byte" kann in anderen Kontexten anders definiert sein, aber wenn Sie über C oder C ++ sprechen, ist es besser, sich an die Definition des Standards zu halten.
Keith Thompson
3
OP, ich würde Ihre akzeptierte Antwort überdenken. Ja wirklich. Wenn ein Zeichen garantiert die Größe 1 hat, warum sollte man dann eine Notiz schreiben using byte = unsigned charund damit fertig sein (wie in der Antwort von rmp vorgeschlagen)?
Einpoklum
Antworten:
32
Nein, in C ++ gibt es keinen Byte-Datentyp. Sie können jedoch jederzeit den Bitset-Header aus der Standardbibliothek einfügen und ein typedef für das Byte erstellen:
typedefbitset<8> BYTE;
NB: Da WinDef.h BYTE für Windows-Code definiert, möchten Sie möglicherweise etwas anderes als BYTE verwenden, wenn Sie beabsichtigen, Windows als Ziel festzulegen.
Bearbeiten: Als Antwort auf den Vorschlag, dass die Antwort falsch ist. Die Antwort ist nicht falsch. Die Frage war "Gibt es in C ++ einen 'Byte'-Datentyp?". Die Antwort war und ist: "Nein, es gibt keinen Byte-Datentyp in C ++", wie beantwortet.
In Bezug auf die vorgeschlagene mögliche Alternative, für die gefragt wurde, warum ist die vorgeschlagene Alternative besser?
Nach meiner Kopie des C ++ - Standards zu der Zeit:
"Als Zeichen (char) deklarierte Objekte müssen groß genug sein, um ein Mitglied des Basiszeichensatzes der Implementierung zu speichern": 3.9.1.1
Ich habe das gelesen, um vorzuschlagen, dass die Größe eines Zeichens 16 Bit betragen würde, wenn eine Compiler-Implementierung 16 Bit zum Speichern eines Mitglieds des Basiszeichensatzes benötigt. Dass heutige Compiler dazu neigen, 8 Bit für ein Zeichen zu verwenden, ist eine Sache, aber soweit ich das beurteilen kann, gibt es sicherlich keine Garantie dafür, dass es 8 Bit sein werden.
Andererseits beschreibt "das Klassenvorlagen-Bitset <N> ein Objekt, das eine Sequenz speichern kann, die aus einer festen Anzahl von Bits N besteht." : 20.5.1. Mit anderen Worten, durch Angabe von 8 als Vorlagenparameter erhalte ich ein Objekt, das eine Sequenz aus 8 Bits speichern kann.
Ob die Alternative zu char im Kontext des zu schreibenden Programms besser ist oder nicht, hängt daher meines Wissens von Ihrem Compiler und Ihren jeweiligen Anforderungen ab, auch wenn ich mich irre. Daher war es für mich Sache des Einzelnen, den Code zu schreiben, festzustellen, ob die vorgeschlagene Alternative für seine Anforderungen / Wünsche / Bedürfnisse geeignet war.
Die Antwort ist falsch, und alle anderen sind falsch, außer jwodder, das die einzig richtige Antwort ist. Byte ist BIT_CHAR-Bits, nicht 8 Bits.
Mark Galeck
14
Vielleicht möchten Sie diese Antwort aktualisieren, da es jetzt einenstd::byte
NathanOliver
1
@Persixty oops warum habe ich gesagt BIT_CHAR. Es ist ein Mysterium. Ein Geheimnis des Universums.
Mark Galeck
87
Nein, bytein C ++ gibt es keinen Typ namens " ". Was Sie wollen , ist statt unsigned char(oder, wenn man genau 8 Bits benötigen, uint8_taus <cstdint>, da C ++ 11 ). Beachten Sie, dass dies charnicht unbedingt eine genaue Alternative ist, wie dies signed charbei einigen Compilern und unsigned charbei anderen der Fall ist .
std::byteEs kann keine Arithmetik ausgeführt werden, was ein Deal Breaker sein könnte.
Pharap
3
@Pharap, es kommt darauf an - nicht in der Lage zu sein, versehentlich zu rechnen, kann für einige Anwendungsfälle als Vorteil angesehen werden. Da std::bytenur eine Ergänzung ist , kann man das richtige Werkzeug für den Job wählen (dh entweder std::byte, char, unsigned charoder uint_8).
maxschlepzig
27
Wenn Sie Windows verwenden, haben Sie in WinDef.h:
Warum ist diese Aufzählung Ihrer Meinung nach besser als typedef unsigned char byte;oder typedef std::uint8_t byte;?
Einpoklum
2
@einpoklum erhöht die Typensicherheit. Beispielsweise erhalten Sie einen Kompilierungsfehler, wenn Sie versehentlich einen solchen Bytewert multiplizieren. Obwohl es beim Aliasing nicht hilft . Wenn Sie einige Bytes richtig aliasen möchten char*, unsigned char*oder std::byte*.
Maxschlepzig
1
Es std::bytekann nur keine Arithmetik ausgeführt werden, was ein Deal Breaker sein könnte.
Wenn Ihre C ++ - Version nicht über std :: byte verfügt, wird ein Bytetyp im Namespace std definiert. Normalerweise möchten Sie std keine Dinge hinzufügen, aber in diesem Fall fehlt standardmäßig etwas.
std :: byte aus der STL führt viel mehr Operationen aus.
char
.char
ist notwendigerweise ein Byte. Es ist nur so, dass ein Byte nicht unbedingt 8 Bit ist.CHAR_BIT
. Ich habe an mehr als einem eingebetteten System gearbeitet, bei dem Bytes nicht 8 Bit lang sind. Ein Zeichen hat eine Größe von 1, also ist ein Zeichen immer ein Byte.char
, die mindestens 8 Bit beträgt . Der Begriff "Byte" kann in anderen Kontexten anders definiert sein, aber wenn Sie über C oder C ++ sprechen, ist es besser, sich an die Definition des Standards zu halten.using byte = unsigned char
und damit fertig sein (wie in der Antwort von rmp vorgeschlagen)?Antworten:
Nein, in C ++ gibt es keinen Byte-Datentyp. Sie können jedoch jederzeit den Bitset-Header aus der Standardbibliothek einfügen und ein typedef für das Byte erstellen:
typedef bitset<8> BYTE;
NB: Da WinDef.h BYTE für Windows-Code definiert, möchten Sie möglicherweise etwas anderes als BYTE verwenden, wenn Sie beabsichtigen, Windows als Ziel festzulegen.
Bearbeiten: Als Antwort auf den Vorschlag, dass die Antwort falsch ist. Die Antwort ist nicht falsch. Die Frage war "Gibt es in C ++ einen 'Byte'-Datentyp?". Die Antwort war und ist: "Nein, es gibt keinen Byte-Datentyp in C ++", wie beantwortet.
In Bezug auf die vorgeschlagene mögliche Alternative, für die gefragt wurde, warum ist die vorgeschlagene Alternative besser?
Nach meiner Kopie des C ++ - Standards zu der Zeit:
"Als Zeichen (char) deklarierte Objekte müssen groß genug sein, um ein Mitglied des Basiszeichensatzes der Implementierung zu speichern": 3.9.1.1
Ich habe das gelesen, um vorzuschlagen, dass die Größe eines Zeichens 16 Bit betragen würde, wenn eine Compiler-Implementierung 16 Bit zum Speichern eines Mitglieds des Basiszeichensatzes benötigt. Dass heutige Compiler dazu neigen, 8 Bit für ein Zeichen zu verwenden, ist eine Sache, aber soweit ich das beurteilen kann, gibt es sicherlich keine Garantie dafür, dass es 8 Bit sein werden.
Andererseits beschreibt "das Klassenvorlagen-Bitset <N> ein Objekt, das eine Sequenz speichern kann, die aus einer festen Anzahl von Bits N besteht." : 20.5.1. Mit anderen Worten, durch Angabe von 8 als Vorlagenparameter erhalte ich ein Objekt, das eine Sequenz aus 8 Bits speichern kann.
Ob die Alternative zu char im Kontext des zu schreibenden Programms besser ist oder nicht, hängt daher meines Wissens von Ihrem Compiler und Ihren jeweiligen Anforderungen ab, auch wenn ich mich irre. Daher war es für mich Sache des Einzelnen, den Code zu schreiben, festzustellen, ob die vorgeschlagene Alternative für seine Anforderungen / Wünsche / Bedürfnisse geeignet war.
quelle
bitset<8>
besser alsunsigned char
?std::byte
BIT_CHAR
. Es ist ein Mysterium. Ein Geheimnis des Universums.Nein,
byte
in C ++ gibt es keinen Typ namens " ". Was Sie wollen , ist stattunsigned char
(oder, wenn man genau 8 Bits benötigen,uint8_t
aus<cstdint>
, da C ++ 11 ). Beachten Sie, dass dieschar
nicht unbedingt eine genaue Alternative ist, wie diessigned char
bei einigen Compilern undunsigned char
bei anderen der Fall ist .quelle
char
,,signed char
undunsigned char
sind drei verschiedene Typen.char
hat die gleiche Darstellung wie einer der beiden anderen.unsigned char
es größer als 8 Bit ist,uint8_t
wird es nicht definiert.<stdint.h>
statt einschließen<cstdint>
.Ja, es gibt
std::byte
(definiert in<cstddef>
).C ++ 17 hat es eingeführt.
quelle
std::byte
Es kann keine Arithmetik ausgeführt werden, was ein Deal Breaker sein könnte.std::byte
nur eine Ergänzung ist , kann man das richtige Werkzeug für den Job wählen (dh entwederstd::byte
,char
,unsigned char
oderuint_8
).Wenn Sie Windows verwenden, haben Sie in WinDef.h:
typedef unsigned char BYTE;
quelle
Mit
C++11
ist eine schöne Version für einen manuell Byte Typen definiert:enum class byte : std::uint8_t {};
Das macht zumindest die GSL .
Beginnend mit
C++17
(fast) ist genau diese Version im Standard definiert alsstd::byte
(danke Neil Macintosh für beide).quelle
typedef unsigned char byte;
odertypedef std::uint8_t byte;
?char*
,unsigned char*
oderstd::byte*
.std::byte
kann nur keine Arithmetik ausgeführt werden, was ein Deal Breaker sein könnte.Nein, aber seit C ++ 11 gibt es [u] int8_t .
quelle
Es gibt auch byte_lite , kompatibel mit C ++ 98, C ++ 11 und höher.
quelle
namespace std { // define std::byte enum class byte : unsigned char {}; };
Wenn Ihre C ++ - Version nicht über std :: byte verfügt, wird ein Bytetyp im Namespace std definiert. Normalerweise möchten Sie std keine Dinge hinzufügen, aber in diesem Fall fehlt standardmäßig etwas.
std :: byte aus der STL führt viel mehr Operationen aus.
quelle