Gibt es in C ++ einen 'Byte'-Datentyp?

85

Wenn vorhanden, gibt es eine Header-Datei, die eingeschlossen werden soll?

Dieser Code gibt einen Kompilierungsfehler:

#include <iostream>

using namespace std;

int main()
{
    byte b = 2;

    cout << b << endl;

    return 0;
}
user2972135
quelle
15
Es heißt char.
Avidan Borisov
12
@ Ben char ist 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:

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.

Darren Gansberg
quelle
59
Wie ist bitset<8>besser als unsigned char?
Keith Thompson
12
Es ist nicht. benutze unsigniertes
Zeichen
2
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 .

jwodder
quelle
8
Nicht ganz. char,, signed charund unsigned charsind drei verschiedene Typen. charhat die gleiche Darstellung wie einer der beiden anderen.
Keith Thompson
2
Wenn unsigned chares größer als 8 Bit ist, uint8_twird es nicht definiert.
Keith Thompson
1
Wenn Sie sich in Ziel-c befinden, müssen Sie möglicherweise <stdint.h>statt einschließen <cstdint>.
Orion Elenzil
2
@orionelenzil Die Frage war über C ++, nicht Ziel C.
Pharap
2
@pharap - ein Schreiben von C oder C ++ in einem Objective-C-Kontext kann meinen Kommentar nützlich finden.
Orion Elenzil
42

Ja, es gibt std::byte(definiert in <cstddef>).

C ++ 17 hat es eingeführt.

maxschlepzig
quelle
2
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:

typedef unsigned char BYTE;
rmp
quelle
22

Mit C++11ist 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 als std::byte(danke Neil Macintosh für beide).

m8mble
quelle
4
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.
Pharap
4

Nein, aber seit C ++ 11 gibt es [u] int8_t .

Sergei
quelle
1

Es gibt auch byte_lite , kompatibel mit C ++ 98, C ++ 11 und höher.

Ruipacheco
quelle
1
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.

Chris Reid
quelle