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

use*_*135 73 c++

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

此代码提供编译错误:

#include <iostream>

using namespace std;

int main()
{
    byte b = 2;

    cout << b << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

jwo*_*der 79

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

  • 不完全的.`char`,`signed char`和`unsigned char`是三种不同的类型.`char`具有与其他两个中的一个相同的表示. (8认同)
  • 请更新此答案以反映 C++17 中 `std::byte` 的存在。 (4认同)
  • @orionelenzil 问题是关于 C++,而不是客观的 C。 (3认同)
  • @pharap - 在 Objective-C 上下文中编写 C 或 C++ 的人可能会发现我的评论很有用。 (3认同)
  • 如果`unsigned char`大于8位,则不会定义`uint8_t`. (2认同)
  • 如果你在 Objective-c 中,你可能需要包含 `&lt;stdint.h&gt;` 而不是 `&lt;cstdint&gt;`。 (2认同)

max*_*zig 32

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

C++ 17引入了它.

  • `std :: byte`不能对其执行算术运算,这可能会破坏交易。 (2认同)
  • @Pharap,取决于-在某些用例中,不能偶然进行算术可能被视为优势。由于`std :: byte`只是一个补充,因此可以为工作选择合适的工具(即`std :: byte`,`char`,`unsigned char`或`uint_8)。 (2认同)

Dar*_*erg 27

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

typedef bitset<8> BYTE;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

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

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

  • `bitset <8>`比`unsigned char`更好? (56认同)
  • 您可能希望更新此答案,因为现在有一个`std :: byte` (11认同)
  • 不是.使用unsigned char (8认同)
  • 答案是错误的,所有其他答案都是错误的,除了 jwodder 是唯一正确的答案。byte 是 BIT_CHAR 位,而不是 8 位。 (2认同)

rmp*_*rmp 24

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

typedef unsigned char BYTE;
Run Code Online (Sandbox Code Playgroud)


m8m*_*ble 21

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

enum class byte : std::uint8_t {};
Run Code Online (Sandbox Code Playgroud)

这至少是GSL的作用.

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

  • 在你看来,为什么这个枚举比`typedef unsigned char byte;`或`typedef std :: uint8_t byte;`? (3认同)
  • @einpoklum,它增加了类型安全性.例如,当您意外地乘以这样的字节值时,会出现编译错误.虽然它没有[帮助别名](/sf/ask/3048616581/).如果你想要正确别名一些字节,你需要`char*`,`unsigned char*`或`std :: byte*`. (2认同)
  • 除了“std::byte”不能对其执行算术之外,这可能会破坏交易。 (2认同)