Чи існує в C ++ тип даних "byte"?


85

Якщо існує, чи є файл заголовка для включення?

Цей код видає помилку компіляції:

#include <iostream>

using namespace std;

int main()
{
    byte b = 2;

    cout << b << endl;

    return 0;
}

15
Це називається char.
Авідан Борисов

12
@Ben char - це обов'язково один байт. Просто байт - це не обов’язково 8 біт.
Авідан Борисов

4
@Ben: Ви, мабуть, не знайомі з більш екзотичними платформами, що існують. Байт, безумовно, не визначається як 8 біт, незалежно від того, що переважають 8 біт. Ось чому ми маємо CHAR_BIT. Я працював над кількома вбудованими системами, де байти не мають довжини 8 біт. Знаком char визначено розмір 1, так що так, char - це завжди байт.
Ed S.

11
@Ben: Стандарти C та C ++ однозначно визначають "байт" як розмір a char, який становить щонайменше 8 біт. Термін "байт" може бути визначений по-різному в інших контекстах, але при обговоренні C або C ++ краще дотримуватися визначення стандарту.
Кіт Томпсон,

3
ОП, я б переглянути вашу прийняту відповідь. Дійсно. Крім того, якщо символ гарантовано має розмір 1, навіщо писати нотатки using byte = unsigned charі робити з цим (як пропонується відповідь rmp)?
einpoklum

Відповіді:


34

Ні, в С ++ немає байтового типу даних. Однак ви завжди можете включити заголовок бітсету зі стандартної бібліотеки і створити typedef для байта:

typedef bitset<8> BYTE;

Примітка. З огляду на те, що WinDef.h визначає BYTE для коду Windows, можливо, ви захочете використовувати щось інше, ніж BYTE, якщо ви плануєте націлити Windows.

Редагувати: у відповідь на припущення, що відповідь неправильна. Відповідь не хибна. Питання було "Чи є в C ++ тип даних" байт "?". Відповідь була і є: "Ні, у C ++ немає байтового типу даних", як відповіли.

Щодо запропонованої можливої ​​альтернативи, для якої було поставлено запитання, чому запропонована альтернатива краща?

Відповідно до моєї копії стандарту C ++, на той час:

"Об'єкти, оголошені як символи (char), повинні бути достатньо великими для зберігання будь-якого члена базового набору символів реалізацій": 3.9.1.1

Я прочитав це, щоб припустити, що якщо реалізація компілятора вимагає 16 біт для зберігання члена основного набору символів, тоді розмір символу буде 16 біт. Те, що сучасні компілятори, як правило, використовують 8 бітів для символу - це одне, але, наскільки я можу сказати, точно немає гарантії, що це буде 8 бітів.

З іншого боку, "біт шаблону класу <N> описує об’єкт, який може зберігати послідовність, що складається з фіксованої кількості бітів, N." : 20.5.1. В інших словах, вказавши 8 як параметр шаблону, я отримую об'єкт, який може зберігати послідовність, що складається з 8 бітів.

Чи є альтернативу кращою для написання, у контексті написаної програми, отже, наскільки я розумію, хоч я і помиляюся, залежить від вашого компілятора та ваших вимог на той час. Отже, особа, яка пише код, на мій погляд, повинна була визначити, чи запропонована альтернатива відповідає їхнім вимогам / потребам / потребам.


59
Як bitset<8>краще ніж unsigned char?
Кіт Томпсон,

12
Це не. використовувати непідписаний символ
YasserAsmi

2
Відповідь неправильна, а всі інші помилкові, за винятком jwodder, який є єдино правильною відповіддю. байт - це BIT_CHAR біт, а не 8 біт.
Mark Galeck

14
Можливо, ви захочете оновити цю відповідь, оскільки зараз -std::byte
NathanOliver

1
@Persixty ой, чому я сказав BIT_CHAR? Це загадка. Таємниця Всесвіту ..
Марк Галек

87

Ні, byteу C ++ немає типу, який називається " ". Натомість ви хочете unsigned char(або, якщо вам потрібно рівно 8 біт, uint8_tвід <cstdint>, починаючи з C ++ 11 ). Зауважте, що charце не обов’язково точна альтернатива, як це означає signed charдля одних компіляторів та unsigned charінших.


8
Не зовсім. char,, signed charі unsigned charє трьома різними типами. charмає таке саме подання, як один із двох інших.
Кіт Томпсон,

2
Якщо unsigned charбільший за 8 біт, тоді uint8_tне буде визначено.
Кіт Томпсон,

1
якщо ви перебуваєте у завданні-c, можливо, вам доведеться включити <stdint.h>замість <cstdint>.
orion elenzil

2
@orionelenzil Питання стосувалося C ++, а не об'єктивного C.
Фарап,

2
@pharap - одне написання C або C ++ в контексті Objective-C може виявити корисним мій коментар.
orion elenzil

42

Так, існує std::byte(визначено в <cstddef>).

C ++ 17 представив його.


2
std::byteне може виконуватися арифметика на ній, що може перервати угоду.
Фарап

3
@Pharap, це залежить - відсутність випадкової арифметики може розглядатися як перевага для деяких випадків використання. Так як std::byteце всього лише доповнення можна вибрати правильний інструмент для роботи (тобто або std::byte, char, unsigned charабо uint_8).
maxschlepzig

27

якщо ви використовуєте windows, у WinDef.h у вас є:

typedef unsigned char BYTE;

22

Використовуючи C++11хорошу версію для вручну визначеного типу байта:

enum class byte : std::uint8_t {};

Принаймні так робить GSL .

Починаючи з C++17(майже) цієї самої версії, вона визначена в стандарті як std::byte(спасибі Нілу Макінтошу за обидва).


4
Чому цей перелік, на вашу думку, кращий за typedef unsigned char byte;чи typedef std::uint8_t byte;?
einpoklum

2
@einpoklum, це підвищує безпеку типу. Наприклад, ви отримуєте помилку компіляції, коли випадково перемножуєте таке байтове значення. Хоча з псевдонімами це не допомагає . Коли ви хочете правильно встановити псевдонім деяких потрібних вам байт char*, unsigned char*або std::byte*.
maxschlepzig

1
За винятком std::byteтого, що на ньому не можна виконувати арифметику, яка може перервати угоду.
Pharap



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

};

Це якщо у вашій версії С ++ немає std :: byte, буде визначено тип байта в просторі імен std. Зазвичай ви не хочете додавати речі в std, але в цьому випадку це стандартна річ, якої не вистачає.

std :: byte з STL робить набагато більше операцій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.