你们可以解释下面的程序
int main()
{
int max = ~0;
printf("%d\n",max);
return 0;
}
AFAIK~将翻转位。在这种情况下,即〜0会将所有位设置为1.因此,最大变量应包含MAX值,但我将o / p设为-1。那么这里的任何人都可以告诉我为什么我的o / p为-1。
答案 0 :(得分:6)
为什么您希望获得“最大值”?在2的补码有符号表示中,全1位模式代表-1
。这就是它的方式。
二进制补码有符号表示中的最大值由01111...1
位模式表示(即第一位为0
)。你得到的是1111...1
,这显然是负的,因为第一位 - 符号位是1
。
如果您想要一个补码零产生“最大值”的示例,请使用 unsigned 表示
int main() {
unsigned max = ~0u;
printf("%u\n", max);
}
答案 1 :(得分:1)
这是正确的输出,因为您使用的是已签名的int
数据类型。你需要阅读两个补码负面表示。所有一位都不是最大负值,程序输出时为-1。最大负有符号值是最高有效位设置,所有剩余位为零,在32位情况下为0x80000000。在32位情况下,最大正有符号值为0x7fffffff。
答案 2 :(得分:1)
以上答案已经涵盖~0
背后的原因-1。
如果要查找最大整数值,则可以包含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;
}
答案 3 :(得分:0)
这个问题很久以前,但为了后人的缘故:
如果你按照以下方式打印〜0作为int和hex,它可能会帮助你更好地看到它:
printf("compliment of zero %d\n", (~0));
printf("compliment of zero 0x%x\n", (~0));
输出:
零-1的赞美
赞美零0xffffffff