C ++中是否存在'byte'数据类型?

时间:2013-11-16 22:24:39

标签: c++

如果存在要包含的头文件?

此代码提供编译错误:

#include <iostream>

using namespace std;

int main()
{
    byte b = 2;

    cout << b << endl;

    return 0;
}

8 个答案:

答案 0 :(得分:76)

不,C ++中没有名为“byte”的类型。您想要的是unsigned char(或者,如果您需要8位,uint8_t来自<cstdint>since C++11)。请注意,char不一定是准确的替代方案,因为它在某些编译器上是signed char,在其他编译器上是unsigned char

答案 1 :(得分:27)

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

C++ 17介绍了它。

答案 2 :(得分:26)

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

typedef bitset<8> BYTE;

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

编辑:回答有关答案错误的建议。  答案没错。问题是“C ++中是否存在'字节'数据类型?”。答案是并且是:“没有C ++中没有字节数据类型”作为回答。

关于建议的可能替代方案,为什么建议的替代方案更好?

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

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

我读到这一点建议如果编译器实现需要16位来存储基本字符集的成员,那么char的大小将是16位。今天的编译器倾向于使用8位来表示char是一回事,但据我所知,肯定不能保证它是8位。

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

在编写程序的上下文中,替代方法是否更好于char,因此,据我所知,虽然我可能错了,但是根据您的编译器和您当时的要求。因此,就我而言,编写代码的个人应该确定建议的替代方案是否适合他们的要求/需求。

答案 3 :(得分:22)

如果你使用的是Windows,你可以在WinDef.h中找到:

typedef unsigned char BYTE;

答案 4 :(得分:20)

使用C++11,手动定义的字节类型有一个很好的版本:

enum class byte : std::uint8_t {};

这至少是GSL的作用。

C++17开始(几乎)这个版本在标准中被定义为std::byte(感谢Neil Macintosh两者)。

答案 5 :(得分:2)

不,但是因为C ++ 11有[u]int8_t

答案 6 :(得分:1)

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

};

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

STL中的

std :: byte执行更多操作。

答案 7 :(得分:0)