std::uint8_t(-1) 与 std::uint8_t(0xffu) 的区别和细微差别

时间:2021-04-15 16:42:33

标签: c++

我已经看到使用 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 < 8,我们得到更少)?

或者是我完全遗漏了什么?

1 个答案:

答案 0 :(得分:1)

这是获取无符号类型最大值的快捷方式,而不必关心它的宽度。所有无符号类型都以模 2n 为模,因此 unsigned_type(-1)std::numeric_limits<unsigned_type>::max() 相同。