Olá pessoal
quero pegar o maior inteiro representado em uma máquina utilizando somente operadores binários.
pra isso,
escrevi o seguinte código:
[code]
int max = 0; // 00…00000;
max = ~max; // 11…1111;
max = max>>1; //era pra ser 01…1111;[/code]
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.
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.
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;
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 >> 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.
[quote=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…
[/quote]
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.