C++ 如何确定int中的位数

C++ 如何确定int中的位数,c++,c,sizeof,C++,C,Sizeof,这就是我所尝试的: int i=-1,size=1; while (i>>1) size++; printf("%d",size); 目标是在不使用sizeof运算符的情况下确定int的大小 上面的循环是无限的。有没有办法修复它,使它按照预期的方式工作?您选择了负数进行右移。 将负数右移,它将被符号位1填充(或不填充,具体取决于实现),因此您的值永远不能为0(=false),这意味着您将得到您所抱怨的无限循环。只需对i使用unsigned,而不是int。他们是 保证具有相同

这就是我所尝试的:

int i=-1,size=1;
while (i>>1)
    size++;
printf("%d",size);
目标是在不使用
sizeof
运算符的情况下确定
int
的大小


上面的循环是无限的。有没有办法修复它,使它按照预期的方式工作?

您选择了负数进行右移。

将负数右移,它将被符号位1填充(或不填充,具体取决于实现),因此您的值永远不能为0(=false),这意味着您将得到您所抱怨的无限循环。

只需对
i
使用
unsigned
,而不是
int
。他们是 保证具有相同的大小,有符号整数的右移位由实现定义(但通常会在符号位中移位)。别忘了分开
结果由
CHAR\u位
(不能保证为8)生成。

您的循环确实是无限的。 从i=1开始向左移动,直到到达i=0并停止。你有零头

-编辑---
这同样适用于有符号整数和无符号整数。

“给我一些解决方案。”当然。。。不从礼貌开始。右移有符号整数值是实现定义的,但通常会进行符号扩展。使用相应的无符号类型将解决眼前的问题,但正确的解决方案是使用
sizeof
。猜测这是某种家庭作业。Upvoting。这根本不是一个坏问题,尽管最初的措辞有点简洁。
(size\u t)(((int*)0)+1)
+1,但是re“不要忘了将结果除以CHAR\u位(不能保证为8)。”-问题要求位数。(上面写的是“不使用sizeof”,但这并不是说需要克隆
sizeof
)谢谢你的帮助。@TonyD是的。我看到了对
sizeof
的引用,并对此做出了反应。比特数更为复杂,因为它有两种不同的定义:他的算法旨在返回值比特数
CHAR\u BIT*sizeof(int)
将返回实际位数。(但存在差异的机器应该非常罕见。)。。。除了它是有符号整数的未定义行为(至少在C中)。