C ++中是否有“字节”数据类型?


85

如果存在,是否包含头文件?

这段代码给出了编译错误:

#include <iostream>

using namespace std;

int main()
{
    byte b = 2;

    cout << b << endl;

    return 0;
}

15
叫做char
Avidan Borisov

12
@Ben必须char 一个字节。只是一个字节不一定是8位。
Avidan Borisov

4
@Ben:您显然不熟悉现有的更奇特的平台。不管8位字节占主导地位,一个字节当然都不能定义为8位。这就是为什么CHAR_BIT。我已经研究了多个嵌入式系统,其中字节的长度不是8位。一个char的大小定义为1,因此,是的,char始终是一个字节。
Ed S.

11
@Ben:C和C ++标准明确地定义一个“字节”为的大小char,这是至少8位。在其他情况下,术语“字节”的定义可能有所不同,但是在讨论C或C ++时,最好遵循标准的定义。
Keith Thompson

3
OP,我会重新考虑您接受的答案。真。另外,如果保证一个char的大小为1,为什么还要注释using byte = unsigned char并完成它(如rmp的答案所示)?
einpoklum 2015年

Answers:


34

不,C ++中没有字节数据类型。但是,您始终可以包括标准库中的bitset标头,并为字节创建一个typedef:

typedef bitset<8> BYTE;

注意:鉴于WinDef.h为Windows代码定义了BYTE,因此如果您打算以Windows为目标,则可能要使用BYTE以外的其他名称。

编辑:针对答案错误的建议。答案没有错。问题是“ C ++中是否有'byte'数据类型?”。答案过去是:“没有C ++中没有字节数据类型”。

关于被问到的建议替代方案,为什么建议的替代方案更好?

根据我的C ++标准副本,当时:

“声明为字符(char)的对象应足够大以存储实现基本字符集的任何成员”:3.9.1.1

我读到这是建议,如果编译器实现需要16位来存储基本字符集的成员,则char的大小将为16位。当今的编译器倾向于将8位用于一个char是一回事,但据我所知,当然不能保证它将是8位。

另一方面,“类模板bitset <N>描述了可以存储由固定位数N组成的序列的对象”。:20.5.1。换句话说,通过指定8作为模板参数,我得到一个对象,该对象可以存储由8位组成的序列。

据我所知,尽管我可能是错的,但就编写的程序而言,替代方法是否优于char取决于我当时的编译器和要求。因此,就我个人而言,取决于编写代码的个人来确定建议的替代方案是否适合他们的要求/需求/需求。


59
怎么bitset<8>好过unsigned char
Keith Thompson

12
不是。使用未签名的字符
YasserAsmi '17

2
答案是错误的,所有其他答案都是错误的,只有jwodder除外,这是唯一正确的答案。字节是BIT_CHAR位,而不是8位。
Mark Galeck

14
您可能需要更新此答案,因为现在有std::byte
NathanOliver

1
@Persixty哎呀我为什么这么说BIT_CHAR。这是一个谜。宇宙之谜..
Mark Galeck

87

不,byte在C ++中没有称为“ ”的类型。你想,而不是什么unsigned char(或者,如果您需要的8位,uint8_t距离<cstdint>因为C ++ 11)。请注意,这char不一定是准确的替代方法,因为它对signed char某些编译器和unsigned char其他编译器都意味着。


8
不完全的。charsigned charunsigned char是三种不同的类型。char具有与其他两个之一相同的表示。
Keith Thompson

2
如果unsigned char大于8位,则uint8_t不会定义。
Keith Thompson

1
如果您使用的是Objective-C,则可能需要添加<stdint.h>而不是<cstdint>
Orion elenzil

2
@orionelenzil问题是关于C ++,而不是目标
C。– Pharap

2
@pharap-在Objective-C上下文中编写C或C ++的人可能会发现我的评论有用。
Orion elenzil

42

是的,有std::byte(在中定义<cstddef>)。

C ++ 17引入了它。


2
std::byte无法对其执行算术运算,这可能会破坏交易。
法拉普

3
@Pharap,取决于-在某些用例中,不能偶然进行算术可能被视为优势。由于std::byte只是一个另外一个可以选择的合适的工具(即要么std::bytecharunsigned charuint_8)。
maxschlepzig

27

如果您使用的是Windows,则在WinDef.h中,您可以:

typedef unsigned char BYTE;

22

C++11对于手动定义的字节类型,使用一个不错的版本:

enum class byte : std::uint8_t {};

至少这就是GSL所做的。

C++17(几乎)开始,此版本在标准中定义为std::byte(感谢Neil Macintosh都为)。


4
您认为为什么这个枚举比typedef unsigned char byte;or更好typedef std::uint8_t byte;
einpoklum

2
@einpoklum,它增加了类型安全性。例如,当您不小心将这样的字节值相乘时,就会出现编译错误。虽然它对别名没有帮助。当你想正确的别名一些字节需要char*unsigned char*std::byte*
maxschlepzig

1
除非std::byte无法对其执行运算,否则可能会破坏交易。
法拉普



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

};

如果您的C ++版本没有std :: byte,则它将在命名空间std中定义字节类型。通常,您不想将任何东西添加到std中,但是在这种情况下,这是缺少的标准东西。

STL中的std :: byte执行更多操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.