在下面的程序中,重复的〜和<

#include <iostream>

int main()
{
    int x{};
    for(int i{}; i < 32; ++i) {
        x = ~x;
        x <<= 1;
        std::cout << x << '\n';
    }
}

我的评估是,这将因为未定义左移而未实现。可以肯定地说,只有int大于32位会不会收敛吗?

最佳答案



上面的陈述是错误的。负零值的左移为undefined behavior,并且初始零值的位被反转后,该值为负数。

如果变量是一个无符号整数,那么可以说,它将在所有兼容平台上收敛为正值(如果移位的位足够多):

#include <iostream>
#include <limits>

int main()
{
    unsigned short x{};
    for(int i{}; i < CHAR_BIT*sizeof(unsigned short); ++i) {
        x = ~x;
        x <<= 1;
        std::cout << x << '\n';
    }
}

产生(在2的补码系统上):
65534
2
65530
10
65514
42
65450
170
65194
682
64170
2730
60074
10922
43690
43690

10-06 04:09