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

s6fujrry  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(124)

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

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;
}

字符串
其中dataBlockstd::vector<std::byte>Tin的类型,而m_addrstd::array<std::byte, 2>。这会进行位移位,以便将bool的值存储在一个字节内。我的问题是关于if语句中的第一行。对于这个示例,我将使用in = 1m_addr[1] = 3
根据我的理解,static_cast<uint32_t>(in)创建一个由00000000,00000000,00000000,00000001给出的uint32_t;左移运算符将其转换为00000000,00000000,00000000,00001000,然后将其转换为std::byte
std::byte如何选择要存储的字节?我假设它存储LSB,所以00001000,但我找不到任何参考来证实这一点。它是否可以存储MSB(所以00000000)?如果可以,我如何使下面的实现与平台无关?

pdsfdshx

pdsfdshx1#

std::byte的定义是:enum class byte : unsigned char {};(每[cstddef.syn]
因此,当从uint32_t创建std::byte时,以下规则适用于[expr.static.cast]/10
整型或枚举类型的值可以显式转换为完整枚举类型。如果枚举类型具有固定的基础类型,则首先通过整型转换(如有必要)将值转换为该类型,然后再转换为枚举类型
其中[conv.integral]/2适用于:
如果目标类型是无符号类型,则结果值是与源整数全等的最小无符号整数(模2n,其中n是用于表示无符号类型的位数)。[注意:在二进制补码表示中,这种转换是概念性的,位模式没有变化(如果没有截断)。-end note ]
因此,在您的示例中,您将获得最低有效字节。
注:引用自N4713(C++17草案)

相关问题