gpt4 book ai didi

c++ - 奇怪的行为设置位

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:32 24 4
gpt4 key购买 nike

我正在开发一个系统,该系统要求我能够设置构成整数类型的各个位。

我写了一个程序来测试一些二元运算符的用法。下面是一个使用二进制 OR 运算符将位设置为 true 的小示例。但是这种行为让我感到困惑。如果我循环遍历,将每一位设置为真,它会在第 31 位之后突然将所有位设置为真。我不确定为什么这会考虑到我在 64 位机器上并且我正在使用 numeric_limits 来获取位数。

#include <iostream>
#include <bitset>
#include <limits>

int main() {

typedef unsigned long long ullong;
ullong bits;

for(int i = 0; i < std::numeric_limits<ullong>::digits; ++i) {
bits |= (1 << i);
std::cout << std::bitset<std::numeric_limits<ullong>::digits>(bits) << "\n";
}

return 0;
}

这个程序的输出如下:

0000000000000000000000000000000000000000000000000000000000000001
0000000000000000000000000000000000000000000000000000000000000011
0000000000000000000000000000000000000000000000000000000000000111
0000000000000000000000000000000000000000000000000000000000001111
0000000000000000000000000000000000000000000000000000000000011111
0000000000000000000000000000000000000000000000000000000000111111
0000000000000000000000000000000000000000000000000000000001111111
0000000000000000000000000000000000000000000000000000000011111111
0000000000000000000000000000000000000000000000000000000111111111
0000000000000000000000000000000000000000000000000000001111111111
0000000000000000000000000000000000000000000000000000011111111111
0000000000000000000000000000000000000000000000000000111111111111
0000000000000000000000000000000000000000000000000001111111111111
0000000000000000000000000000000000000000000000000011111111111111
0000000000000000000000000000000000000000000000000111111111111111
0000000000000000000000000000000000000000000000001111111111111111
0000000000000000000000000000000000000000000000011111111111111111
0000000000000000000000000000000000000000000000111111111111111111
0000000000000000000000000000000000000000000001111111111111111111
0000000000000000000000000000000000000000000011111111111111111111
0000000000000000000000000000000000000000000111111111111111111111
0000000000000000000000000000000000000000001111111111111111111111
0000000000000000000000000000000000000000011111111111111111111111
0000000000000000000000000000000000000000111111111111111111111111
0000000000000000000000000000000000000001111111111111111111111111
0000000000000000000000000000000000000011111111111111111111111111
0000000000000000000000000000000000000111111111111111111111111111
0000000000000000000000000000000000001111111111111111111111111111
0000000000000000000000000000000000011111111111111111111111111111
0000000000000000000000000000000000111111111111111111111111111111
0000000000000000000000000000000001111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111

最佳答案

这是因为 1 被视为整数,因此,当它被扩展为 64 位整数时,它会被符号扩展。无符号整数改为零扩展。

这是积分扩展的两种不同行为。整数扩展是当整数类型转换为更大的整数类型时发生的事情:计算机显然不能让新位随机,因此编译器会选择两种一致的行为之一。

  • 符号扩展采用符号位并为该整数的所有新位重复它:这样,如果您采用 int 并将其设为 long,它仍然是相同的数字和相同的符号。这是扩展有符号整数时通常会发生的情况。
  • 用零代替零扩展垫,无论数字是什么,它现在都是正数(但如果它是正数,它保持不变)。这是扩展无符号整数时通常会发生的情况,为此您将符号位视为常规数字位。

您还需要告诉编译器 1 至少与您的 bits 变量一样大,否则 1 会在您移动时“脱落”:您正在移动它超过了 int 的大小,因此将被丢弃。您可以通过将 1 转换为 ullong ((ullong)1),或者更简洁地使用 ull 前缀:1ull

关于c++ - 奇怪的行为设置位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20570997/

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