你们可以请解释一下下面的程序按位补运算符
int main()
{
int max = ~0;
printf("%d\n",max);
return 0;
}
AFAIK〜会翻转位。在这种情况下,即〜0将把所有位设置为1.所以max变量应该包含MAX值,但是我将o/p设置为-1。所以任何人都可以在这里告诉我为什么我得到o/p为-1。
你们可以请解释一下下面的程序按位补运算符
int main()
{
int max = ~0;
printf("%d\n",max);
return 0;
}
AFAIK〜会翻转位。在这种情况下,即〜0将把所有位设置为1.所以max变量应该包含MAX值,但是我将o/p设置为-1。所以任何人都可以在这里告诉我为什么我得到o/p为-1。
你为什么期望获得“最大值”?在2的补码有符号表示中,全1位模式代表-1
。这只是它的方式。
以2的补码有符号表示的最大值由01111...1
位模式表示(即第一位是0
)。你得到的是1111...1
,由于第一位符号位是1
,所以显然是负数。
如果你想去的地方补零产生“最大值”的一个例子,使用无符号表示
int main() {
unsigned max = ~0u;
printf("%u\n", max);
}
这是正确的输出,因为您使用的是签署了int
数据类型。你需要阅读有关二的补码否定表达。所有一位不是最大负值,它是程序输出时的-1。最大负数有符号值是最重要的位设置,所有其余的位为零,在32位情况下为0x80000000。在32位情况下,最大正符号值为0x7fffffff。
以上答案已经涵盖了值为-1的~0
背后的原因。
如果你正在寻找的最大整数值,那么你可以包括limits.h中库,并使用该库
INT_MAX
给你最大的带符号整型值声明的常量。 UINT_MAX
为您提供了最大的无符号整数值。
#include <stdio.h>
#include <limits.h>
int main()
{
printf("Max signed int value: %d \n", INT_MAX);
printf("Max unsigned int value: %u \n", UINT_MAX);
return 0;
}
这个问题是很久以前的事,但对后人的缘故:
它可以帮助你看到它更好,如果你打印〜0既是int和十六进制如下:
printf("compliment of zero %d\n", (~0));
printf("compliment of zero 0x%x\n", (~0));
输出:
称赞的零 -1
称赞的 零的0xffffffff
注意,变量/表达的两种类型**和**格式指示符('%u')必须同意为这也工作。如果他们不匹配,你有未定义的行为。 –