Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么std::bitset建议的可用位比sizeof说的要多? 我正在研究C++中的一些简单的位操作问题,在试图可视化我的步骤时遇到了这个问题。我知道分配给不同原语类型的位数可能因系统而异。对于我的机器,sizeof(int)输出4,因此我的值有4个char值。我现在也知道字节的定义通常是8位,但不一定是这样。当我输出CHAR\u位时我得到8。因此,我希望我的int值总共有32位_C++_Sizeof_Unsigned_Bitset - Fatal编程技术网

为什么std::bitset建议的可用位比sizeof说的要多? 我正在研究C++中的一些简单的位操作问题,在试图可视化我的步骤时遇到了这个问题。我知道分配给不同原语类型的位数可能因系统而异。对于我的机器,sizeof(int)输出4,因此我的值有4个char值。我现在也知道字节的定义通常是8位,但不一定是这样。当我输出CHAR\u位时我得到8。因此,我希望我的int值总共有32位

为什么std::bitset建议的可用位比sizeof说的要多? 我正在研究C++中的一些简单的位操作问题,在试图可视化我的步骤时遇到了这个问题。我知道分配给不同原语类型的位数可能因系统而异。对于我的机器,sizeof(int)输出4,因此我的值有4个char值。我现在也知道字节的定义通常是8位,但不一定是这样。当我输出CHAR\u位时我得到8。因此,我希望我的int值总共有32位,c++,sizeof,unsigned,bitset,C++,Sizeof,Unsigned,Bitset,然后,我可以继续将我的int的二进制值打印到屏幕上: int max=~0; //All my bits are turned on now std::cout<<std::bitset<sizeof(int)*CHAR_BIT>(max)<<std::endl; $:11111111111111111111111111111111 std::bitset的构造函数采用一个无符号长,当您尝试将一个-1(这是int中的~0赋值给一个无符号长时,您得到的值为1

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

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

$:11111111111111111111111111111111

std::bitset
的构造函数采用一个
无符号长
,当您尝试将一个-1(这是
int
中的
~0
赋值给一个
无符号长
时,您得到的值为1的8个字节(64位)


unsigned int
不会发生这种情况,因为在编写
int max=~0时,赋值的是4294967295,而不是-1,在
unsigned long
中是32 1s
max
将是32位,用1填充,被解释为整数is
-1

当你写作时

std::bitset<sizeof(int)*CHAR_BIT>(max)
// basically, same as
std::bitset<32>(-1)
然后,当你写作时:

std::bitset<sizeof(int)*CHAR_BIT*3>(max)
// basically, same as
std::bitset<96>(-1)
std::bitset<sizeof(unsigned int)*CHAR_BIT*3>(unmax)
// basically, same as
std::bitset<96>(UINT_MAX)
另一方面,当您编写
unsigned int unmax=~0
,您将所有1分配给一个
无符号整数
,因此得到
UINT\u MAX

然后,当你写作时:

std::bitset<sizeof(int)*CHAR_BIT*3>(max)
// basically, same as
std::bitset<96>(-1)
std::bitset<sizeof(unsigned int)*CHAR_BIT*3>(unmax)
// basically, same as
std::bitset<96>(UINT_MAX)

顺便说一下,mad支持完全遵循sizeof()和CHAR_SIZE的标准。大多数人都认为这些事情是理所当然的,尤其是后来的事情。谢谢你详细的回答,现在对我来说很有意义。我目前正在为即将到来的面试做准备,所以我正在尽可能多地学习这些东西是如何工作的,很高兴我走上了正确的道路!值得一提的是“零扩展”和“符号扩展”这两个术语,这样人们就知道如果他们想进一步阅读,应该搜索什么。因为维护平台独立性(甚至不假设
CHAR\u BIT
为8)是一个非常痛苦的问题,你可能想提到
~0==-1
只适用于2的补码表示。嗯,我不明白你怎么会得到2147483647,你是说4294967295吗?事实上,
无符号int
的最大值是
4294967295
(32 1s对应于
2^32-1
)。呃,这就是我在周日晚上回答问题的结果。。。固定的。谢谢
000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111
std::bitset<sizeof(unsigned int)*CHAR_BIT*3>(unmax)
// basically, same as
std::bitset<96>(UINT_MAX)
000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111