Esiste un tipo di dati "byte" in C ++?


86

Se esiste, c'è un file di intestazione da includere?

Questo codice fornisce un errore di compilazione:

#include <iostream>

using namespace std;

int main()
{
    byte b = 2;

    cout << b << endl;

    return 0;
}

15
Si chiama char.
Avidan Borisov

12
@Ben char è necessariamente un byte. È solo che un byte non è necessariamente 8 bit.
Avidan Borisov

4
@ Ben: apparentemente non hai familiarità con le piattaforme più esotiche esistenti. Un byte non è certamente definito come 8 bit, indipendentemente dal fatto che siano predominanti i byte a 8 bit. Ecco perché l'abbiamo CHAR_BIT. Ho lavorato su più di un sistema embedded in cui i byte non sono lunghi 8 bit. Un carattere è definito per avere una dimensione di 1, quindi sì, un carattere è sempre un byte.
Ed S.

11
@ Ben: gli standard C e C ++ definiscono in modo univoco un "byte" come la dimensione di a char, che è di almeno 8 bit. Il termine "byte" può essere definito in modo diverso in altri contesti, ma quando si parla di C o C ++ è meglio attenersi alla definizione dello standard.
Keith Thompson

3
OP, riconsidererei la tua risposta accettata. Veramente. Inoltre, se è garantito che un carattere abbia la dimensione 1, perché scrivere una nota using byte = unsigned chare farla finita (come suggerisce la risposta di rmp)?
einpoklum

Risposte:


35

No, non esiste un tipo di dati byte in C ++. Tuttavia puoi sempre includere l'intestazione del set di bit dalla libreria standard e creare un typedef per byte:

typedef bitset<8> BYTE;

NB: Dato che WinDef.h definisce BYTE per il codice di Windows, potresti voler usare qualcosa di diverso da BYTE se intendi scegliere come target Windows.

Modifica: in risposta al suggerimento che la risposta è sbagliata. La risposta non è sbagliata. La domanda era "Esiste un tipo di dati" byte "in C ++?". La risposta era ed è: "No, non esiste un tipo di dati byte in C ++" come risposta.

Per quanto riguarda la possibile alternativa suggerita per la quale è stato chiesto, perché l'alternativa suggerita è migliore?

Secondo la mia copia dello standard C ++, al momento:

"Gli oggetti dichiarati come caratteri (char) devono essere sufficientemente grandi da contenere qualsiasi membro del set di caratteri di base delle implementazioni": 3.9.1.1

Ho letto questo per suggerire che se un'implementazione del compilatore richiede 16 bit per memorizzare un membro del set di caratteri di base, la dimensione di un carattere sarebbe di 16 bit. Il fatto che i compilatori odierni tendano a usare 8 bit per un carattere è una cosa, ma per quanto ne so non c'è certamente alcuna garanzia che saranno 8 bit.

D'altra parte, "il modello di classe bitset <N> descrive un oggetto che può memorizzare una sequenza composta da un numero fisso di bit, N." : 20.5.1. In altre parole, specificando 8 come parametro del modello, mi ritrovo con un oggetto che può memorizzare una sequenza composta da 8 bit.

Se l'alternativa è migliore o meno a char, nel contesto del programma in fase di scrittura, dipende quindi, per quanto ho capito, anche se potrei sbagliarmi, dal tuo compilatore e dalle tue esigenze in quel momento. Spettava quindi all'individuo che scrive il codice, per quanto mi riguarda, determinare se l'alternativa suggerita fosse appropriata per le proprie esigenze / desideri / esigenze.


60
Come è bitset<8>meglio di unsigned char?
Keith Thompson

13
Non è. usa caratteri non firmati
YasserAsmi

2
La risposta è sbagliata e tutte le altre sono sbagliate, tranne jwodder che è l'unica risposta corretta. byte è bit BIT_CHAR, non 8 bit.
Mark Galeck

14
Potresti voler aggiornare questa risposta poiché ora c'è unstd::byte
NathanOliver

1
@ Persixty oops perché ho detto BIT_CHAR. È un mistero. Un mistero dell'universo ..
Mark Galeck

88

No, non esiste un tipo chiamato " byte" in C ++. Quello che vuoi invece è unsigned char(o, se hai bisogno esattamente di 8 bit, uint8_tda <cstdint>, da C ++ 11 ). Nota che charnon è necessariamente un'alternativa accurata, come significa signed charsu alcuni compilatori e unsigned charsu altri.


8
Non proprio. char, signed chare unsigned charsono tre tipi distinti. charha la stessa rappresentazione di uno degli altri due.
Keith Thompson

2
Se unsigned charè maggiore di 8 bit, uint8_tnon sarà definito.
Keith Thompson,

1
se ti trovi nell'obiettivo-c, potresti dover includere <stdint.h>invece di <cstdint>.
orion elenzil

2
@orionelenzil La domanda riguardava C ++, non l'obiettivo C.
Pharap

2
@pharap - chi scrive C o C ++ in un contesto Objective-C potrebbe trovare utile il mio commento.
orion elenzil

42

Sì, c'è std::byte(definito in <cstddef>).

C ++ 17 lo ha introdotto.


2
std::bytenon può eseguire operazioni aritmetiche su di esso, il che potrebbe essere un insuccesso.
Pharap

3
@Pharap, dipende: non essere in grado di eseguire accidentalmente operazioni aritmetiche può essere visto come un vantaggio per alcuni casi d'uso. Dal momento che std::byteè solo un'aggiunta si può scegliere lo strumento giusto per il lavoro (cioè o std::byte, char, unsigned charo uint_8).
maxschlepzig

27

se stai usando Windows, in WinDef.h hai:

typedef unsigned char BYTE;

22

Usando C++11c'è una bella versione per un tipo di byte definito manualmente:

enum class byte : std::uint8_t {};

Questo è almeno quello che fa il GSL .

A partire da C++17(quasi) questa stessa versione è definita nello standard come std::byte(grazie Neil Macintosh per entrambi).


4
Perché questa enumerazione è migliore, secondo te, di typedef unsigned char byte;o typedef std::uint8_t byte;?
einpoklum

2
@einpoklum, aumenta la sicurezza dei tipi. Ad esempio, si ottiene un errore di compilazione quando si moltiplica accidentalmente un tale valore di byte. Anche se non aiuta con l'aliasing . Quando vuoi alias correttamente alcuni byte di cui hai bisogno char*, unsigned char*o std::byte*.
maxschlepzig

1
Tranne che std::bytenon è possibile eseguire operazioni aritmetiche su di esso, il che potrebbe essere un insuccesso.
Pharap



1
namespace std
{
  // define std::byte
  enum class byte : unsigned char {};

};

Questo se la tua versione C ++ non ha std :: byte definirà un tipo di byte nello spazio dei nomi std. Normalmente non vuoi aggiungere cose a std, ma in questo caso è una cosa standard che manca.

std :: byte da STL esegue molte più operazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.