@Ben chares 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:
typedefbitset<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.
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.
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).
¿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.
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.
char
.char
es necesariamente un byte. Es solo que un byte no es necesariamente de 8 bits.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.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.using byte = unsigned char
y terminar con él (como sugiere la respuesta de rmp)?Respuestas:
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.
fuente
bitset<8>
mejor queunsigned char
?std::byte
BIT_CHAR
? Es un misterio. Un misterio del universo ..No, no hay ningún tipo llamado "
byte
" en C ++. Lo que quiere en cambio, esunsigned char
(o, si se necesita exactamente 8 bits,uint8_t
a partir<cstdint>
, ya que C ++ 11 ). Tenga en cuenta quechar
no es necesariamente una alternativa precisa, como significasigned char
en algunos compiladores yunsigned char
en otros.fuente
char
,signed char
yunsigned char
son tres tipos distintos.char
tiene la misma representación que uno de los otros dos.unsigned char
es mayor de 8 bits,uint8_t
no se definirá.<stdint.h>
lugar de<cstdint>
.Sí, hay
std::byte
(definido en<cstddef>
).C ++ 17 lo introdujo.
fuente
std::byte
no se puede realizar aritmética en él, lo que podría ser un factor decisivo.std::byte
es sólo una adición uno puede elegir la herramienta adecuada para el trabajo (es decir, bienstd::byte
,char
,unsigned char
ouint_8
).si está usando Windows, en WinDef.h tiene:
typedef unsigned char BYTE;
fuente
El uso de
C++11
allí 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 comostd::byte
(gracias Neil Macintosh por ambos).fuente
typedef unsigned char byte;
otypedef std::uint8_t byte;
?char*
,unsigned char*
ostd::byte*
.std::byte
que no se puede realizar operaciones aritméticas en él, lo que podría ser un factor decisivo.No, pero desde C ++ 11 hay [u] int8_t .
fuente
También hay byte_lite , compatible con C ++ 98, C ++ 11 y posteriores.
fuente
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.
fuente