C ++에 '바이트'데이터 유형이 있습니까?


85

포함 할 헤더 파일이있는 경우

이 코드는 컴파일 오류를 제공합니다.

#include <iostream>

using namespace std;

int main()
{
    byte b = 2;

    cout << b << endl;

    return 0;
}

15
라고 char합니다.
Avidan Borisov 2011

12
@Ben char 반드시 1 바이트입니다. 단지 한 바이트가 반드시 8 비트가 아니라는 것입니다.
Avidan Borisov 2013

4
@Ben : 당신은 현존하는 더 이색적인 플랫폼에 익숙하지 않은 것 같습니다. 8 비트 바이트가 우세하다는 사실에 관계없이 바이트는 확실히 8 비트로 정의되지 않습니다. 그것이 우리가 CHAR_BIT. 바이트 길이가 8 비트가 아닌 하나 이상의 임베디드 시스템에서 작업했습니다. char는 크기가 1로 정의되어 있으므로 예, char는 항상 바이트입니다.
Ed S.

11
@ 벤 : C 및 C ++ 표준 명백하게의 크기는 "바이트"를 정의 char하고, 적어도 8 비트. "바이트"라는 용어는 다른 컨텍스트에서 다르게 정의 될 수 있지만 C 또는 C ++를 논의 할 때는 표준의 정의를 고수하는 것이 좋습니다.
Keith Thompson

3
OP, 수락 된 답변을 재고하겠습니다. 정말. 또한 문자의 크기가 1로 보장되는 경우 왜 메모를 작성 using byte = unsigned char하고 완료해야합니까 (rmp의 답변이 제안하는 것처럼)?
einpoklum 2015

답변:


34

C ++에는 바이트 데이터 유형이 없습니다. 그러나 항상 표준 라이브러리의 bitset 헤더를 포함하고 바이트에 대한 typedef를 만들 수 있습니다.

typedef bitset<8> BYTE;

NB : WinDef.h가 Windows 코드에 대해 BYTE를 정의한다는 점을 감안할 때 Windows를 대상으로하려는 경우 BYTE가 아닌 다른 것을 사용할 수 있습니다.

편집 : 답이 틀렸다는 제안에 대한 응답으로. 대답은 틀리지 않습니다. 질문은 "C ++에 '바이트'데이터 유형이 있습니까?"였습니다. 대답은 "C ++에는 바이트 데이터 유형이 없습니다"입니다.

제안 된 가능한 대안과 관련하여 제안 된 대안이 더 나은 이유는 무엇입니까?

당시 C ++ 표준 사본에 따르면 다음과 같습니다.

"문자 (char)로 선언 된 객체는 구현 기본 문자 집합의 구성원을 저장할 수있을만큼 충분히 커야합니다.": 3.9.1.1

컴파일러 구현에서 기본 문자 집합의 구성원을 저장하는 데 16 비트가 필요한 경우 문자의 크기는 16 비트가 될 것이라고 제안했습니다. 오늘날의 컴파일러는 문자에 8 비트를 사용하는 경향이 있지만 내가 말할 수있는 한 그것이 8 비트가 될 것이라는 보장은 확실히 없습니다.

반면, "클래스 템플릿 bitset <N>은 고정 된 수의 비트 N으로 구성된 시퀀스를 저장할 수있는 객체를 설명합니다." : 20.5.1. 즉, 8을 템플릿 매개 변수로 지정하여 8 비트로 구성된 시퀀스를 저장할 수있는 객체로 끝납니다.

작성되는 프로그램의 맥락에서 대안이 char보다 더 나은지 여부는 내가 이해하는 한, 비록 내가 틀렸을지라도 컴파일러와 그 당시의 요구 사항에 달려 있습니다. 따라서 제안 된 대안이 요구 사항 / 원하는 / 필요한 사항에 적합한 지 여부를 결정하는 것은 내가 아는 한 코드를 작성하는 개인에게 달려 있습니다.


59
bitset<8>보다 나은 방법은 unsigned char무엇입니까?
Keith Thompson

12
아닙니다. 서명 숯불 사용
YasserAsmi

2
답은 틀렸고, 유일한 정답 인 jwodder를 제외하고 다른 모든 것은 틀 렸습니다. 바이트는 8 비트가 아니라 BIT_CHAR 비트입니다.
Mark Galeck

14
이제이있는 한이 답변을 업데이트 할 수있는std::byte
NathanOliver

1
@Persixty 죄송합니다 왜 내가 말했습니까 BIT_CHAR. 미스테리입니다. 우주의 신비 ..
Mark Galeck

87

아니요, byteC ++ 에는 " " 라는 유형이 없습니다 . 당신이 대신 원하는 것은 unsigned char(당신이, 정확하게 8 개 비트를 필요로하는 경우, 또는 uint8_t에서 <cstdint>, C부터 + 11 ). 참고 char뜻으로, 반드시 정확한 대안이없는 signed char일부 컴파일러와 unsigned char다른 사람.


8
좀 빠지는. char,, signed charunsigned char세 가지 유형이 있습니다. char다른 두 개 중 하나와 동일한 표현을가집니다.
Keith Thompson

2
경우 unsigned char8 비트보다 큰, 다음 uint8_t정의되지 않습니다.
Keith Thompson

1
당신이 목표 - C에 있다면, 당신은 포함해야 할 수도 있습니다 <stdint.h>대신 <cstdint>.
orion elenzil 2007 년

2
문제는 C에 대해이었다 @orionelenzil ++, 객관적인 C.
Pharap

2
@pharap-Objective-C 컨텍스트에서 C 또는 C ++를 작성하는 사람은 내 의견이 유용 할 수 있습니다.
orion elenzil

42

예, 있습니다 std::byte(에서 정의 됨 <cstddef>).

C ++ 17에서 도입했습니다.


2
std::byte딜 브레이커가 될 수있는 연산을 수행 할 수 없습니다.
Pharap

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(모두 감사 닐 Macintosh)를 선택합니다.


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 {};

};

C ++ 버전에 std :: byte가없는 경우 std 네임 스페이스에 바이트 유형을 정의합니다. 일반적으로 std에 항목을 추가하고 싶지 않지만이 경우 누락 된 표준 항목입니다.

STL의 std :: byte는 훨씬 더 많은 작업을 수행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.