std::byte 构造函数是否从整数中提取 LSB 或 MSB?

dan*_*n13 3 c++ c++17 std-byte

我正在努力理解以下代码行:

if constexpr (std::is_same_v<T, bool>)
{
    std::byte change = std::byte(static_cast<uint32_t>(in) << m_addr[1]);
    std::byte mask = ~std::byte(1u << m_addr[1]);
    dataBlock[m_addr[0]] = (dataBlock[m_addr[0]] & mask) | change;
}
Run Code Online (Sandbox Code Playgroud)

其中dataBlock是 a std::vector<std::byte>Tin的类型,并且m_addr是 a std::array<std::byte, 2>。这会进行位移位以便将 bool 值存储在字节内。我的问题是关于声明中的第一行if。对于此示例,我将使用in = 1m_addr[1] = 3

根据我的理解,static_cast<uint32_t>(in)创建了一个uint32_t给定的00000000,00000000,00000000,00000001; 左移运算符将其转换为00000000,00000000,00000000,00001000,然后将其转换为std::byte

如何std::byte选择存储的字节?我假设它存储 LSB,所以00001000,但我找不到任何参考资料来证实这一点。它可以存储MSB(所以00000000)吗?如果是,我怎样才能使下面的实现平台无关?

Chr*_*sMM 10

的定义std::byte是:(enum class byte : unsigned char {};[cstddef.syn]

\n

因此,当std::byte从 a创建 a 时uint32_t,以下内容适用[expr.static.cast]/10

\n
\n

整型或枚举类型的值可以显式转换为完全枚举类型。如果枚举类型具有固定的基础类型,则如果需要,首先通过整型转换将值转换为该类型,然后再转换为枚举类型

\n
\n

从中[conv.integral]/2适用:

\n
\n

如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模 2 n,其中 n 是用于表示无符号类型的位数)。[ 注意:在两个\xe2\x80\x99s 补码表示中,此转换是概念性的,位模式没有变化(如果没有截断)。\xe2\x80\x94结束注]

\n
\n

因此,在您的示例中,您将获得最低有效字节。

\n

注意:参考 N4713(C++17 草案)

\n