Оператор побитового дополнения - PullRequest
3 голосов
/ 01 сентября 2011

Не могли бы вы, ребята, объяснить, пожалуйста, приведенную ниже программу

int main() 
{   
 int max = ~0; 
 printf("%d\n",max);    
 return 0; 
}

AFAIK ~ перевернет биты.В этом случае то есть ~ 0 установит все биты в 1. Таким образом, переменная max должна содержать значение MAX, но я получаю o / p как -1.Так может кто-нибудь здесь, пожалуйста, скажите мне, почему я получаю o / p как -1.

Ответы [ 4 ]

6 голосов
/ 01 сентября 2011

Почему вы ожидали получить «максимальное значение»? В представлении со знаком «2 дополнения» битовый шаблон «все 1» обозначает -1. Это просто так.

Максимальное значение в представлении со знаком 2-го дополнения представлено 01111...1 битовой комбинацией (то есть первый бит 0). То, что вы получили, это 1111...1, что, очевидно, отрицательно, поскольку самый первый бит - знаковый бит - это 1.

Если вам нужен пример, где дополненный ноль дает «максимальное значение», используйте unsigned представление

int main() {   
  unsigned max = ~0u; 
  printf("%u\n", max);    
}
1 голос
/ 01 сентября 2011

Приведенные выше ответы уже объяснили причину, по которой ~0 имеет значение -1. ​​

Если вы ищете максимальное целочисленное значение, вы можете включить библиотеку limit.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;
}
1 голос
/ 01 сентября 2011

Это правильный вывод, так как вы используете тип данных int, который подписан. Вы должны прочитать о негативном представлении в дополнение к двум. Все один бит не является максимальным отрицательным значением, это -1 в качестве выходных данных вашей программы. Максимальное отрицательное значение со знаком задается наиболее значимым битом, а все остальные биты равны нулю, 0x80000000 в 32-битном случае. Максимальное положительное значение со знаком равно 0x7fffffff в 32-разрядном случае.

0 голосов
/ 04 июля 2017

Этот вопрос был давным-давно, но для потомков:
Это может помочь вам увидеть его лучше, если вы напечатаете ~ 0 как int и hex, как показано ниже:

printf("compliment of zero %d\n", (~0));
printf("compliment of zero 0x%x\n", (~0));

Вывод:Комплимент ноль -1Комплимент ноль 0xffffffff

...