【问题标题】:std::byte bitwise operators |, &, ^, ~: why cast to unsigned int?std::byte 位运算符 |、&、^、~:为什么要转换为无符号整数?
【发布时间】:2022-06-28 23:26:37
【问题描述】:

根据std::byte\'s documentation on cppreferenceoperator| for std::byte 的实现应该相当于

constexpr std::byte operator|(std::byte l, std::byte r) noexcept
{
    return std::byte{ static_cast<unsigned>(l) | static_cast<unsigned>(r) };
}

(运营商&amp;^~应该同样实现)

如果std::byte\ 的基础类型是char unsigned,为什么lr 需要强制转换为int unsigned

笔记:我知道char unsigned{} | char unsigned{} 会导致int,因为每个操作数在按位或被申请;被应用;而unsigned{} | unsigned{} 返回一个unsigned 并且没有促销发生。但是,我不明白在这种情况下这样的促销可能会导致哪些问题。

  • 注意char unsigned{} | char unsigned{} 的操作数将被提升为unsigned int,以防sizeof(unsigned char) == sizeof(int)。他们并不总是被提升为int
  • @phuclv 谢谢,我不知道。这让static_cast 让我更加困惑。
  • unsigned charint 具有相同的大小是相对不寻常的;它通常只出现在像 DSP 这样只处理字大小的操作而不是字节的专用硬件上。但在那种不寻常的情况下,static_cast 只是多余的,所以它不会真正影响这个问题。

标签: c++ c++17 bitwise-operators std-byte


【解决方案1】:

对于小于int 的整数类型,在应用运算符之前将它们提升为int。这意味着如果你有

return std::byte{ l | r };

那么你将有一个有符号整数。通过使用

return std::byte{ static_cast<unsigned>(l) | static_cast<unsigned>(r) }

您将操作数显式转换为无符号整数,这样就不会发生对int 的提升。

这在 C++20 之前可能会有所不同,因为与无符号整数类型不同,有符号整数不需要使用二进制补码表示。

【讨论】:

  • 你能提供一个可以产生影响的案例吗?
  • @paolo我对非二进制补码表示不太熟悉,所以我没有可以给你的具体例子。
  • 根据 cppreference std::byte 不是数字类型并且没有类型转换运算符,因此不清楚这些转换是如何工作的。
  • @MarkRansom:我也对此感到困惑,但我认为这是一种非正式的描述,就像l,r 实际上是unsigned char 一样。
  • @NateEldredge 和 Mark Ransom std::byteenum class,所有枚举都可以显式转换为整数类型。只是枚举类不允许隐式转换。
猜你喜欢
  • 2017-01-16
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
相关资源
最近更新 更多