¿Hay un tipo de datos 'byte' en C ++?

85

Si existe, ¿hay un archivo de encabezado para incluir?

Este código da error de compilación:

#include <iostream>

using namespace std;

int main()
{
    byte b = 2;

    cout << b << endl;

    return 0;
}
usuario2972135
fuente
15
Se llama char.
Avidan Borisov
12
@Ben char es necesariamente un byte. Es solo que un byte no es necesariamente de 8 bits.
Avidan Borisov
4
@Ben: Aparentemente, no estás familiarizado con las plataformas más exóticas que existen. Ciertamente, un byte no está definido como 8 bits, independientemente del hecho de que los bytes de 8 bits sean predominantes. Por eso lo tenemos CHAR_BIT. He trabajado en más de un sistema integrado donde los bytes no tienen una longitud de 8 bits. Un char se define para tener un tamaño de 1, así que sí, un char es siempre un byte.
Ed S.
11
@Ben: Los estándares C y C ++ definen de forma inequívoca un "byte" como el tamaño de a char, que es de al menos 8 bits. El término "byte" puede definirse de forma diferente en otros contextos, pero cuando se habla de C o C ++ es mejor ceñirse a la definición del estándar.
Keith Thompson
3
OP, reconsideraría su respuesta aceptada. De Verdad. Además, si se garantiza que un carácter tiene tamaño 1, ¿por qué escribir notas using byte = unsigned chary terminar con él (como sugiere la respuesta de rmp)?
einpoklum

Respuestas:

34

No, no hay ningún tipo de datos de bytes en C ++. Sin embargo, siempre puede incluir el encabezado del conjunto de bits de la biblioteca estándar y crear un typedef para byte:

typedef bitset<8> BYTE;

NB: Dado que WinDef.h define BYTE para el código de Windows, es posible que desee utilizar algo diferente a BYTE si tiene la intención de apuntar a Windows.

Editar: en respuesta a la sugerencia de que la respuesta es incorrecta. La respuesta no es incorrecta. La pregunta era "¿Existe un tipo de datos 'byte' en C ++?". La respuesta fue y es: "No, no hay un tipo de datos de bytes en C ++" como se respondió.

Con respecto a la posible alternativa sugerida para la cual se preguntó, ¿por qué es mejor la alternativa sugerida?

Según mi copia del estándar C ++, en ese momento:

"Los objetos declarados como caracteres (char) deberán ser lo suficientemente grandes para almacenar cualquier miembro del juego de caracteres básico de las implementaciones": 3.9.1.1

Leí eso para sugerir que si la implementación de un compilador requiere 16 bits para almacenar un miembro del conjunto de caracteres básico, entonces el tamaño de un carácter sería de 16 bits. Que los compiladores de hoy tienden a usar 8 bits para un carácter es una cosa, pero por lo que puedo decir, ciertamente no hay garantía de que sea de 8 bits.

Por otro lado, "el conjunto de bits de plantilla de clase <N> describe un objeto que puede almacenar una secuencia que consta de un número fijo de bits, N." : 20.5.1. En otras palabras, al especificar 8 como parámetro de plantilla, termino con un objeto que puede almacenar una secuencia que consta de 8 bits.

Que la alternativa sea mejor o no para char, en el contexto del programa que se está escribiendo, depende, por lo que yo entiendo, aunque puedo estar equivocado, de su compilador y de sus requisitos en ese momento. Por lo tanto, dependía de la persona que escribía el código, en lo que a mí respecta, determinar si la alternativa sugerida era apropiada para sus requisitos / deseos / necesidades.

Darren Gansberg
fuente
59
¿Cómo es bitset<8>mejor que unsigned char?
Keith Thompson
12
No es. use unsigned char
YasserAsmi
2
La respuesta es incorrecta y todas las demás están equivocadas, excepto jwodder, que es la única respuesta correcta. byte son bits BIT_CHAR, no 8 bits.
Mark Galeck
14
Es posible que desee actualizar esta respuesta, ya que ahora hay unstd::byte
NathanOliver
1
@Persixty oops, ¿por qué dije BIT_CHAR? Es un misterio. Un misterio del universo ..
Mark Galeck
87

No, no hay ningún tipo llamado " byte" en C ++. Lo que quiere en cambio, es unsigned char(o, si se necesita exactamente 8 bits, uint8_ta partir <cstdint>, ya que C ++ 11 ). Tenga en cuenta que charno es necesariamente una alternativa precisa, como significa signed charen algunos compiladores y unsigned charen otros.

jwodder
fuente
8
No exactamente. char, signed chary unsigned charson tres tipos distintos. chartiene la misma representación que uno de los otros dos.
Keith Thompson
2
Si unsigned chares mayor de 8 bits, uint8_tno se definirá.
Keith Thompson
1
si está en el objetivo-c, es posible que deba incluir en <stdint.h>lugar de <cstdint>.
orion elenzil
2
@orionelenzil La pregunta era sobre C ++, no C. objetiva
Pharap
2
@pharap: alguien que escriba C o C ++ en un contexto Objective-C puede encontrar útil mi comentario.
orion elenzil
42

Sí, hay std::byte(definido en <cstddef>).

C ++ 17 lo introdujo.

maxschlepzig
fuente
2
std::byteno se puede realizar aritmética en él, lo que podría ser un factor decisivo.
Pharap
3
@Pharap, depende: no poder hacer aritmética accidentalmente puede verse como una ventaja para algunos casos de uso. Dado que std::bytees sólo una adición uno puede elegir la herramienta adecuada para el trabajo (es decir, bien std::byte, char, unsigned charo uint_8).
maxschlepzig
27

si está usando Windows, en WinDef.h tiene:

typedef unsigned char BYTE;
rmp
fuente
22

El uso de C++11allí es una buena versión para un tipo de byte definido manualmente:

enum class byte : std::uint8_t {};

Eso es al menos lo que hace la GSL .

Comenzando con C++17(casi) esta misma versión se define en el estándar como std::byte(gracias Neil Macintosh por ambos).

m8mble
fuente
4
¿Por qué esta enumeración es mejor, en su opinión, que typedef unsigned char byte;o typedef std::uint8_t byte;?
einpoklum
2
@einpoklum, aumenta la seguridad de los tipos. Por ejemplo, obtiene un error de compilación cuando multiplica accidentalmente dicho valor de byte. Aunque no ayuda con la creación de alias . Cuando desee alias correctamente algunos bytes que necesita char*, unsigned char*o std::byte*.
maxschlepzig
1
Excepto std::byteque no se puede realizar operaciones aritméticas en él, lo que podría ser un factor decisivo.
Pharap
1

También hay byte_lite , compatible con C ++ 98, C ++ 11 y posteriores.

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

};

Esto, si su versión de C ++ no tiene std :: byte, definirá un tipo de byte en el espacio de nombres std. Normalmente no desea agregar cosas a std, pero en este caso es una cosa estándar que falta.

std :: byte del STL hace muchas más operaciones.

Chris Reid
fuente