在下面的程序中,重复的〜和<
#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