C++17中std::byte的具体使用详解

 更新时间:2023年11月27日 13:59:09   作者:fengbingchun  
这篇文章主要为大家详细介绍了C++17中std::byte的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

C++17中std::byte的定义如下:std::byte本质上代表一个字节的值

enum class byte : unsigned char {};

与unsigned char一样,std::byte可以用来访问其它对象(对象表示)占用的原始内存(raw memory),但与unsigned char不同的是,它不是字符类型,也不是算术类型。std::byte模型只是位的集合,仅支持按位和比较操作。

函数std::is_integral_v<T>定义如下:判断T是不是整型,如T为整型,则返回true;如果T的类型为bool、char、char16_t、char32_t、wchar_t、short、int、long、long long,以及任何实现定义的扩展整数类型(any implementation-defined extended integer types),包括任何有符号、无符号、和cv限定的变体(cv-qualified variants),则返回true

template< class T >
inline constexpr bool is_integral_v = is_integral<T>::value;

std::byte相关函数:

(1).std::to_integer<T>(std::byte):将std::byte对象转换为整型T,仅当is_integral_v<T>为true时有效;

(2).左移:<<=, 等价于: b = (std::byte)b << (T)shift; 仅当is_integral_v<T(shift)>为true时有效;

(3).左移:<<,等价于: std::byte(static_cast<unsigned int>(b) << (T)shift); 仅当is_integral_v<T(shift)>为true时有效;

(4).右移:>>=, 等价于: b = (std::byte)b >> (T)shift; 仅当is_integral_v<T(shift)>为true时有效;

(5).右移: >>, 等价于:std::byte(static_cast<unsigned int>(b) >> (T)shift); 仅当is_integral_v<T(shift)>为true时有效;

(6).按位&=、|=、^=:等价于:l = l & r; l = l | r; l = l ^ r;

(7).按位&、|、^、~:等价于:std::byte(static_cast<unsigned int>(l) | static_cast<unsigned int>(r));等

注意:

(1).列表初始化(使用花括号初始化)是唯一可以直接初始化std::byte对象的方法。

(2).std::byte对象存储在栈上。

(3).sizeof(std::byte)的大小总是1.

(4).大多数时候std::byte位数是8,但在有些平台上可能不是。

(5).用std::to_integer<>(std::byte)可以把std::byte转换为任意基本整数类型(bool、字符类型或者整数类型)。

(6).std::byte没有定义输入和输出运算符,因此不得不把它转换为整数类型再进行I/O。

以下为测试代码:

namespace {
 
std::ostream& operator<<(std::ostream& os, std::byte b)
{
    return os << std::bitset<8>(std::to_integer<int>(b));
}
 
} // namespace
 
int test_byte()
{
    // 注意:列表初始化(使用花括号初始化)是唯一可以直接初始化std::byte对象的方法
    std::byte b{ 66 };
    std::cout << b << "\n"; // 01000010
 
    std::byte b2 = b << 1;
    std::cout << b2 << "\n"; // 10000100
    b <<= 1;
    std::cout << b << "\n"; // 10000100
 
    std::byte b3 = b >> 1;
    std::cout << b3 << "\n"; // 01000010
    b >>= 1;
    std::cout << b << "\n"; // 01000010
 
    std::byte b4 = b | std::byte{ 0b11110000 };
    std::cout << b4 << "\n"; // 11110010
    b |= std::byte{ 0b11110000 };
    std::cout << b << "\n"; // 11110010
 
    b4 = b & std::byte{ 0b11110000 };
    std::cout << b4 << "\n"; // 11110000
    b &= std::byte{ 0b11110000 };
    std::cout << b << "\n"; // 11110000
 
    b4 = b ^ std::byte{ 0b11111111 };
    std::cout << b4 << "\n"; // 00001111
    b ^= std::byte{ 0b11111111 };
    std::cout << b << "\n"; // 00001111
 
    b4 = ~b;
    std::cout << b4 << "\n"; // 11110000
 
    std::byte b5;
    //std::cout << b5 << "\n"; // error: 如果没有初始化,std::byte对象的值是未定义的,因为它存储在栈上
 
    std::byte b6{};
    std::cout << b6 << "\n"; // 00000000
 
    std::cout << "sizeof std::byte: " << sizeof(std::byte) << "\n"; // sizeof std::byte: 1
 
    std::byte b7{ 0xFF };
    std::cout << std::to_integer<unsigned int>(b7) << ","
        << std::to_integer<int>(b7) << ","
        << static_cast<int>(std::to_integer<signed char>(b7)) << "\n"; // 255,255,-1
 
    return 0;
}

执行结果如下图所示:

GitHub:https://github.com/fengbingchun/Messy_Test

到此这篇关于C++17中std::byte的具体使用详解的文章就介绍到这了,更多相关C++17 std::byte内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言SQLite3事务和锁的操作实例

    C语言SQLite3事务和锁的操作实例

    这篇文章主要介绍了C语言SQLite3事务和锁的操作,结合完整实例形式分析了C语言针对SQLite3数据库的事务与锁相关操作技巧,需要的朋友可以参考下
    2017-07-07
  • C++编写实现飞机大战

    C++编写实现飞机大战

    这篇文章主要为大家详细介绍了C++编写实现飞机大战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++用两个栈实现一个队列(面试官的小结)

    C++用两个栈实现一个队列(面试官的小结)

    这篇文章主要给大家介绍了关于C++用两个栈实现一个队列的相关资料,这是来自一名面试官的小结,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • 关于CLion配置visual studio(msvc)和JOM多核编译的问题

    关于CLion配置visual studio(msvc)和JOM多核编译的问题

    这篇文章主要介绍了CLion配置visual studio(msvc)和JOM多核编译,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • C++类常量和类枚举

    C++类常量和类枚举

    这篇文章主要介绍了C++类常量和类枚举,给类当中定义一些常量,可以给所有类的对象使用,比如说我们在类当中定义一个数组,希望可以定义一个常量,用来初始化数组的长度,那么下面我i吗就来看看过程当如何吧
    2022-01-01
  • C++模板类的用法

    C++模板类的用法

    这篇文章主要介绍了C++模板类的用法,实例讲述了模板类的概念及相关用法,需要的朋友可以参考下
    2014-10-10
  • tcp socket客户端和服务端示例分享

    tcp socket客户端和服务端示例分享

    这篇文章主要介绍了tcp socket客户端和服务端示例,需要的朋友可以参考下
    2014-03-03
  • WIN32程序获取父进程ID的方法

    WIN32程序获取父进程ID的方法

    这篇文章主要介绍了WIN32程序获取父进程ID的方法,在进行windows程序开发的时候有一定的实用价值,需要的朋友可以参考下
    2014-08-08
  • C 语言基础之C语言的常见关键字

    C 语言基础之C语言的常见关键字

    C语言中有一些预先定义的字符串,他们本身被赋予了自身的功能。并且我们在定义变量的时候,不能去抢他们的名字来用。他们就是今天的主角:关键字,下面文章将给大家做详细介绍
    2021-09-09
  • C++实现读取图片长度和宽度

    C++实现读取图片长度和宽度

    这篇文章主要介绍了C++实现读取图片长度和宽度,本文直接给出实现代码,需要的朋友可以参考下
    2015-04-04

最新评论