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>
,T
是in
的类型,并且m_addr
是 a std::array<std::byte, 2>
。这会进行位移位以便将 bool 值存储在字节内。我的问题是关于声明中的第一行if
。对于此示例,我将使用in = 1
和m_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]
)
因此,当std::byte
从 a创建 a 时uint32_t
,以下内容适用[expr.static.cast]/10
\n\n整型或枚举类型的值可以显式转换为完全枚举类型。如果枚举类型具有固定的基础类型,则如果需要,首先通过整型转换将值转换为该类型,然后再转换为枚举类型
\n
从中[conv.integral]/2
适用:
\n\n如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模 2 n,其中 n 是用于表示无符号类型的位数)。[ 注意:在两个\xe2\x80\x99s 补码表示中,此转换是概念性的,位模式没有变化(如果没有截断)。\xe2\x80\x94结束注]
\n
因此,在您的示例中,您将获得最低有效字节。
\n注意:参考 N4713(C++17 草案)
\n