gpt4 book ai didi

c++ - 如果我递减 `std::size_t(0)` 是否保证等于 `std::size_t(-1)`?

转载 作者:太空狗 更新时间:2023-10-29 23:35:00 26 4
gpt4 key购买 nike

这是证据:

inline
constexpr std::size_t prev(std::size_t i) {
--i;
return i;
}

int main() {
static const std::size_t i = 0;
static_assert(prev(i) == std::size_t(-1), "Decrementing should give std::size_t(-1)");
return 0;
}

使用 -std=c++14 可以愉快地编译。

我遇到这个是因为我有一个循环索引 std::vector 并且想向后循环,所以我把它改成了

for (std::size_t i = std::min(idx, v.size() - 1); i != std::size_t(-1); --i) { ... }

现在,我意识到我可以使用 std::vector::reverse_iterator,但我现在真正的问题是,我期望的行为是否定义明确?

最佳答案

size_t 是一个未指定的无符号整数。

C++ 中的所有无符号整数都被建模为整数环的元素,模 2n 对于特定于该无符号整数类型的某个数字 n。

当您将有符号整数转换为无符号整数时,您会在整数环中对无符号类型的常量 n 取模 2n 的值。对于 -1,这是 2n-1。

当您将 0 作为无符号整数类型递减时,您将得到 2n-1。

这两个值是相同的。

请参阅 C++ 标准中的 [basic.fundamental] 3.9.1/4:

Unsigned integers shall obey the laws of arithmetic modulo2nwherenis the number of bits in the valuerepresentation of that particular size of integer.

(引自最近的标准草案 N3690,但它所代表的事实不会很快改变;段落编号可能会改变。)

查找有关如何从有符号整数转换的引用将涉及更多标准追逐;但它最终会成为你想要的。

关于c++ - 如果我递减 `std::size_t(0)` 是否保证等于 `std::size_t(-1)`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51639509/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com