【发布时间】:2021-04-15 16:42:33
【问题描述】:
我在这里看到了 std::uint8_t(-1) 的用法:
https://en.cppreference.com/w/cpp/language/fold
CPP 参考说明了字节顺序交换,我想知道与 std::uint8_t(0xffu) 相比有什么区别?
在 x86 上似乎没有任何区别: https://godbolt.org/z/Kb7v8K1nT
我的问题可能是阅读过多,这只是某人编写代码的惯例,并没有更深层次的含义。但是,我怀疑这是由于代码在某些深奥的架构上的可移植性,其中 CHAR_BIT != 8
但后来我想知道在需要 8 位对齐的字节顺序交换的情况下,我希望 std::uint8_t(0xffu) 并强制进行 8 位计算即使 CHAR_BIT != 8 那么这会产生更多的可移植代码,因为它预计不会在平台之间改变?例如,当我生成 TCP/IP 数据包并且需要具有特定的字节顺序(并且可能交换一些值)时,无论使用什么底层架构,它们都需要相同的值。
也许在一个半字节的字符交换中(我们期望类型的大小会改变和机制会调整)然后 std::uint8_t(-1) 会更好?
本质上,使用 std::uint8_t(-1) 我们是说无论有多少位都将所有位设置为高(如果 CHAR_BIT > 8 则更多),而使用 std ::uint8_t(0xffu) 我们想要 8 位设置(如果 CHAR_BIT
或者有什么我完全想念的吗?
【问题讨论】:
-
这取决于您所谈论的 C++ 标准。
-
感谢@Nicol Bolas,我更喜欢使用 C++17,有时也使用 C++20。我错过了一些细微差别吗?
-
虽然使用 std::uint8_t(0xffu) 我们想要 8 位设置(如果 CHAR_BIT
uint8_t不会存在,除非实现也提供 8 位类型。 -
另一种选择是
std::uint8_t(~0u),它避免了 1 的补码 vs 2 的补码表示 -1。 C++ 现在要求 C++ 抽象机的行为就像 2 的补码一样,因此它可能不如过去重要(假设您的目标是 1 的补码机器)。 -
CHAR_BIT < 8在 C 或 C++ 实现中是不允许的。
标签: c++