我正在使用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
如果我希望的话,我可以增加位集大小:
int max=~0;
std::cout<<std::bitset<sizeof(int)*CHAR_BIT*3>(max)<<std::endl;
$:000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111
为什么会有这么多的1?我本来期望只有32个1,前面补充0。但实际上数量是两倍,发生了什么事情?
当我使用与int
相同大小的unsigned int
重复实验时,多余的1就不会出现:
unsigned int unmax=~0;
std::cout<<std::bitset<sizeof(unsigned int)*CHAR_BIT*3>(unmax)<<std::endl;
$:000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111