【问题标题】:Is there 'byte' data type in C++?C++ 中是否有“字节”数据类型?
【发布时间】:2013-11-16 22:24:38
【问题描述】:

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

此代码给出编译错误:

#include <iostream>

using namespace std;

int main()
{
    byte b = 2;

    cout << b << endl;

    return 0;
}

【问题讨论】:

  • 它叫char
  • @Ben char 必须是一个字节。只是一个字节不一定是8位。
  • @Ben:您显然不熟悉现有的更具异国情调的平台。一个字节当然没有定义为 8 位,尽管 8 位字节占主导地位。这就是为什么我们有CHAR_BIT。我曾在不止一个字节长度不是 8 位的嵌入式系统上工作过。 char 被定义为大小为 1,所以是的,char 始终是一个字节。
  • @Ben:C 和 C++ 标准明确地将“字节”定义为char 的大小,即至少 8 位。术语“字节”在其他上下文中的定义可能不同,但在讨论 C 或 C++ 时,最好遵循标准的定义。
  • OP,我会重新考虑您接受的答案。真的。另外,如果保证 char 的大小为 1,为什么要注意写 using byte = unsigned char 并完成它(就像 rmp 的回答所暗示的那样)?

标签: c++


【解决方案1】:

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

【讨论】:

  • 不完全。 charsigned charunsigned char 是三种不同的类型。 char 与其他两个之一具有相同的表示形式。
  • 如果unsigned char大于8位,则uint8_t不会被定义。
  • @orionelenzil 问题是关于 C++,而不是客观 C。
  • @pharap - 在 Objective-C 上下文中编写 C 或 C++ 的人可能会发现我的评论很有用。
  • 请更新此答案以反映 C++17 中 std::byte 的存在。
【解决方案2】:

是的,有std::byte(定义在&lt;cstddef&gt;)。

C++ 17介绍了。

【讨论】:

  • std::byte 不能对其执行算术运算,这可能会破坏交易。
  • @Pharap,这取决于 - 对于某些用例而言,不能意外地进行算术运算可能被视为优势。由于std::byte 只是一个补充,因此可以为工作选择正确的工具(即std::bytecharunsigned charuint_8)。
  • @Pharap - 这就是它的好处所在。 “字节”是关于存储一些数据,而不是将其解释为某个数字
  • @Ezh 我从来没有说过这是一件坏事,只是说它可能会破坏交易(即对于某些用例)。答案没有提到这一点,我认为当一个人试图为工作选择正确的工具时要注意这一点是相当重要的。 IE。我的评论是添加答案本身未包含的信息。
  • @Pharap 原始问题、这个答案以及“字节”的定义都与对其执行算术运算的能力有关。你说的是真的,只是完全没有关系。听起来像“-我们有一个字符串吗?-是的,它是 std::string,请记住 - 它不支持算术运算”
【解决方案3】:

不,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 位。今天的编译器倾向于对 char 使用 8 位是一回事,但据我所知,肯定不能保证它将是 8 位。

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

在正在编写的程序的上下文中,替代方案是否比 char 更好,因此,据我了解,尽管我可能错了,但取决于您的编译器和您当时的要求。因此,就我而言,由编写代码的个人来确定建议的替代方案是否适合他们的要求/想要/需要。

【讨论】:

  • bitset&lt;8&gt;unsigned char 好多少?
  • 不是。使用无符号字符
  • 答案是错误的,其他的都是错误的,除了 jwodder 是唯一正确的答案。 byte 是 BIT_CHAR 位,而不是 8 位。
  • 您可能需要更新此答案,因为现在有一个 std::byte
  • @Persixty 哎呀我为什么说BIT_CHAR。这是一个谜。宇宙之谜..
【解决方案4】:

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

typedef unsigned char BYTE;

【讨论】:

    【解决方案5】:

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

    enum class byte : std::uint8_t {};
    

    至少GSL 是这样做的。

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

    【讨论】:

    • 在您看来,为什么这个枚举比 typedef unsigned char byte;typedef std::uint8_t byte; 更好?
    • @einpoklum,它增加了类型安全性。例如,当您不小心将这样的字节值相乘时,会出现编译错误。虽然不是help with aliasing。当您想要正确地为某些字节起别名时,您需要 char*unsigned char*std::byte*
    • 除了std::byte 不能对其执行算术运算,这可能会破坏交易。
    【解决方案6】:

    没有,但是从 C++11 开始就有[u]int8_t

    【讨论】:

      【解决方案7】:

      还有byte_lite,兼容C++98、C++11及更高版本。

      【讨论】:

        【解决方案8】:
        namespace std
        {
          // define std::byte
          enum class byte : unsigned char {};
        
        };
        

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

        来自 STL 的 std::byte 做了更多的操作。

        【讨论】:

          【解决方案9】:

          在 c++ 中,char 长度为 8 位,但值因用途而异,因此如果您需要它是精确值,则必须使用其前缀版本,例如

          unsigned 0 - 255
          signed (-127) - 127 (with a sign bit in front)
          

          如果你只使用char,它会根据我们插入的值自动选择变量的类型,有时它会给出不可预知的结果。

          还有一些其他类型可以将 unicodes 处理为字符

          char16_t
          char32_t
          wchar_t
          

          【讨论】:

            猜你喜欢
            • 2012-01-03
            • 1970-01-01
            • 2012-08-05
            • 2016-10-11
            • 2016-05-01
            • 2011-03-13
            • 1970-01-01
            • 2020-05-10
            • 1970-01-01
            相关资源
            最近更新 更多