c++ - 为什么 std::bitset 建议的可用位比 sizeof 所说的更多?

标签 c++ sizeof unsigned bitset

我正在处理 C++ 中的一些简单的位操作问题,并在尝试可视化我的步骤时遇到了这个问题。我了解分配给不同原始类型的位数可能因系统而异。对于我的机器,sizeof(int) 输出 4,所以我的值有 4 个 char 位。我现在也知道一个字节的定义通常是8位,但不一定是这样。当我输出 CHAR_BIT 时,我得到 8。因此,我希望我的 int 值总共有 32 位。

然后我可以继续将我的 int 的二进制值打印到屏幕上:

int max=~0; //All my bits are turned on now
std::cout<<std::bitset<sizeof(int)*CHAR_BIT>(max)<<std::endl;

$:11111111111111111111111111111111

如果我愿意,我可以增加 bitset 大小:

int max=~0;
std::cout<<std::bitset<sizeof(int)*CHAR_BIT*3>(max)<<std::endl;

$:000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111

为什么会有这么多?我本来希望只有 32 个,用零填充。反而多了两倍,怎么回事?

当我用与 int 大小相同的 unsigned int 重复实验时,多余的不会出现:

unsigned int unmax=~0;
std::cout<<std::bitset<sizeof(unsigned int)*CHAR_BIT*3>(unmax)<<std::endl;

$:000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111

最佳答案

std::bitset 的构造函数采用 unsigned long long,当您尝试分配 -1 时(即 ~0int) 到 unsigned long long 中,你会得到 8 个字节(64 位),相当于 1s。

unsigned int 不会发生这种情况,因为您分配的值是 4294967295 而不是 -1,即 unsigned long long

关于c++ - 为什么 std::bitset 建议的可用位比 sizeof 所说的更多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49973206/

相关文章:

c++ - WinApi:无法读取注册表

c++ - 访问嵌套类的成员

c - 在下面的程序中,为什么 sizeof 返回的是初始化数组大小的两倍而不是多一个字节?

c - MISRA C :2004, 移位错误

带有嵌套对象优化的 c++ emplace_back

c++ - 为什么我不能将命名空间放在父类构造函数调用中?

C++:获取传递给函数的多维数组的行大小

C - 计算总和并将其乘以 malloc() 中的 sizeof

c - 在 C 中使用 calloc 的二维数组 unsigned char 中的段错误

bit-manipulation - 按位运算有符号和无符号的区别