Maior Inteiro - Linguagem C

4 respostas
J

Olá pessoal

quero pegar o maior inteiro representado em uma máquina utilizando somente operadores binários.

pra isso, escrevi o seguinte código:
int max = 0;   // 00...00000;
max = ~max;   // 11...1111;
max = max>>1;  //era pra ser 01...1111;

entretanto, o valor final de max é 1111...11111 que é o menor inteiro...
obtido pelo inverso do valor 0...
ou seja, a operação max>>1 não está funcionando como eu queria...
alguém sabe qual é o problema?

Lembrando que a representação da máquina é complemento para 2.

4 Respostas

V

No C tem os tipos unsigned. Então o maior inteiro seria:

unsigned int max = 0; max = ~max;

No caso de um signed integer, creio que seja só fazer shift do resultado acima, antes de converte-lo para int.

J

Vini,
um número unsigned representa (2^n)-1 números positivos… onde n é o número de bits…
um número int representa (2^n-1)-1 números positivos, então… não é a mesma coisa…
entretanto eu descobri o problema aqui…

o operador de deslocamento a direita utiliza o deslocamento aritmético…
isso significa que ele conserva o número mais a esquerda…
ex:

1001 >> 2 é igual a 1110…

quando que o deslocamento lógico seria: 0010

eu usei um loop aqui pra descobrir qual a maior representação… (nao posso usar a função size of)
utilizei…

int num =1; while(num>0){ num<<1; } num = ~num;

V

Você falou em número inteiro, não no tipo int.
O unsigned é um número inteiro, sem sinal.

Você pode achar o maior número signed com base num unsigned:

unsigned x = ~0; //Maior unsigned int y = (x &gt;&gt; 1);

Agora, se você só pode usar o tipo int, aí não sei se tem jeito mais fácil do que o que você descreveu.

V

julianofischer:
um número unsigned representa (2^n)-1 números positivos… onde n é o número de bits…
um número int representa (2^n-1)-1 números positivos, então… não é a mesma coisa…

Só uma correçãozinha na matemática, vc se enganou nos parênteses:

um número unsigned representa 2^n-1 números positivos.
um número int representa 2^(n-1)-1 números positivos

Cuidado com a precedência dos operadores.

Criado 5 de setembro de 2010
Ultima resposta 5 de set. de 2010
Respostas 4
Participantes 2