为什么std :: bitset建议比sizeof更多的可用位表示有?

jon*_*lpy 16 c++ unsigned sizeof bitset

我正在研究C++中的一些简单的位操作问题,并在尝试可视化我的步骤时遇到了这个问题.我知道分配给不同基元类型的位数可能因系统而异.对于我的机器,sizeof(int)输出4,所以我的char价值有4 位.我现在也知道一个字节的定义通常是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
Run Code Online (Sandbox Code Playgroud)

如果我想要,我可以增加bitset大小:

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

$:000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)

为什么有这么多?我本来期望只有32个,用零填充.相反,有两倍,发生了什么?

当我重复实验unsigned int,其大小相同时int,额外的实验不会出现:

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

$:000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)

Fra*_*ank 20

std::bitset取一个构造函数unsigned long long,当你尝试将一个-1(也就是~0一个int)分配给一个时unsigned long long,你得到8个字节(64位)的1s.

它不会发生unsigned int因为你正在分配值4294967295而不是-1,这是一个32 1sunsigned long long

  • 值得一提的是"零扩展"和"符号扩展"这些术语,以便人们知道如果他们想要进一步阅读会搜索什么. (8认同)
  • 因为维持平台独立性的问题非常痛苦(不要假设`CHAR_BIT`为8),你可能要提到`~0 == -1`仅适用于2的补码表示. (3认同)