C ++に「バイト」データ型はありますか?


86

存在する場合、インクルードするヘッダーファイルはありますか?

このコードはコンパイルエラーを出します:

#include <iostream>

using namespace std;

int main()
{
    byte b = 2;

    cout << b << endl;

    return 0;
}

15
それはと呼ばれcharます。
Avidan Borisov 2013年

12
@Benchar 必ず1バイトです。1バイトが必ずしも8ビットであるとは限らないというだけです。
Avidan Borisov 2013年

4
@Ben:あなたは明らかに存在するよりエキゾチックなプラットフォームに精通していないようです。8ビットバイトが優勢であるという事実にもかかわらず、バイトは確かに8ビットであると定義されていません。それが私たちが持っている理由CHAR_BITです。私は、バイトの長さが8ビットではない複数の組み込みシステムに取り組んできました。charはサイズが1になるように定義されているため、はい、charは常にバイトです。
Ed S.

11
@Ben:CおよびC ++標準では、「バイト」を少なくとも8ビットcharあるのサイズとして明確に定義しています。「バイト」という用語は、他のコンテキストでは異なって定義される場合がありますが、CまたはC ++について説明する場合は、標準の定義に固執することをお勧めします。
キーストンプソン

3
OP、私はあなたの受け入れられた答えを再考します。本当に。また、charのサイズが1であることが保証されている場合、なぜusing byte = unsigned char(rmpの回答が示唆するように)書き込みを行ってそれを実行するのですか?
einpoklum 2015

回答:


35

いいえ、C ++にはバイトデータ型はありません。ただし、いつでも標準ライブラリのビットセットヘッダーを含めて、バイトのtypedefを作成できます。

typedef bitset<8> BYTE;

注意:WinDef.hがWindowsコードのBYTEを定義していることを考えると、Windowsをターゲットにする場合は、BYTE以外のものを使用することをお勧めします。

編集:答えが間違っているという提案に応えて。答えは間違っていません。質問は「C ++に「バイト」データ型はありますか?」でした。答えは「いいえ、C ++にはバイトデータ型はありません」と答えました。

それが尋ねられた提案された可能な代替案に関して、なぜ提案された代替案がより良いのですか?

当時のC ++標準の私のコピーによると:

「文字(char)として宣言されたオブジェクトは、実装の基本文字セットのメンバーを格納するのに十分な大きさでなければなりません」:3.9.1.1

コンパイラの実装で基本文字セットのメンバーを格納するために16ビットが必要な場合、charのサイズは16ビットになることを示唆するためにそれを読みました。今日のコンパイラがcharに8ビットを使用する傾向があることは1つのことですが、私が知る限り、それが8ビットになるという保証はありません。

一方、「クラステンプレートbitset <N>は、固定数のビットNで構成されるシーケンスを格納できるオブジェクトを記述します。」:20.5.1。つまり、テンプレートパラメータとして8を指定すると、8ビットで構成されるシーケンスを格納できるオブジェクトになります。

したがって、作成中のプログラムのコンテキストで、代替がcharよりも優れているかどうかは、私が理解している限り、間違っているかもしれませんが、コンパイラとそのときの要件によって異なります。したがって、私に関する限り、提案された代替案が彼らの要件/要望/ニーズに適切であるかどうかを判断するのは、コードを書く個人の責任でした。


60
どのようにbitset<8>優れていunsigned charますか?
キーストンプソン

13
そうではありません。unsigned charを使用する
YasserAsmi 2017

2
答えは間違っており、唯一の正解であるjwodderを除いて、他のすべてのものは間違っています。バイトはBIT_CHARビットであり、8ビットではありません。
マークガレック2017

14
現在、この回答を更新することをお勧めしますstd::byte
NathanOliver 2018年

1
@Persixtyおっと、なぜ私は言ったのBIT_CHARですか。それは謎です。宇宙の謎...
マークGaleck

88

いいえ、byteC ++には「」というタイプはありません。あなたが代わりに欲しいのですunsigned char(あなたは、正確に8ビットを必要とする場合、またはuint8_tから<cstdint>C ++以来11)。一部のコンパイラやその他のコンパイラcharでは、これが必ずしも正確な代替手段ではないことに注意してください。signed charunsigned char


8
完全ではありません。charsigned char、およびunsigned char3つの異なる種類があります。char他の2つのうちの1つと同じ表現を持っています。
キーストンプソン

2
unsigned charが8ビットより大きい場合、はuint8_t定義されません。
キーストンプソン

1
Objective-cを使用している場合は、の<stdint.h>代わりに含める必要がある場合があります<cstdint>
orion elenzil 2017年

2
質問@orionelenzil C ++ではなく、客観C.についてだった
Pharap

2
@ pharap-Objective-CのコンテキストでCまたはC ++を書くと、私のコメントが役立つかもしれません。
orion elenzil 2017

42

はい、ありますstd::byte(で定義されています<cstddef>)。

C ++ 17で導入されました。


2
std::byte算術演算を実行することはできません。これは、取引を妨げる可能性があります。
ファラプ2017

3
@Pharap、状況によって異なります。誤って算術演算を実行できないことは、一部のユースケースでは利点と見なされる場合があります。以来std::byteちょうど追加された1(すなわち、いずれかの仕事のための適切なツールを選択することができstd::bytecharunsigned charまたはuint_8)。
maxschlepzig 2017

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 2017

2
@einpoklum、それは型の安全性を高めます。たとえば、このようなバイト値を誤って乗算すると、コンパイルエラーが発生します。エイリアシングに役立ちませんが。必要なバイトを適切にエイリアスする場合はchar*unsigned char*またはstd::byte*
maxschlepzig 2017年

1
ただしstd::byte、算術演算を実行することはできません。これは、取引を妨げる可能性があります。
ファラプ2017



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

};

これは、C ++バージョンにstd :: byteがない場合、名前空間stdでバイトタイプを定義します。通常、stdに追加することは望ましくありませんが、この場合、不足しているのは標準的なものです。

STLのstd :: byteは、さらに多くの操作を実行します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.