Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

IvanR

[Resolvido] Warning que não consigo tirar

Recommended Posts

um exemplo:

sendo que os valores das variaveis numero sao preenchidas pelo usuario, não está ai o problema

 

int numero;
int numero 2;
double vetor[1];

		  vetor[1] = (((numero * numero2) << 32) >> 32); 
		  vetor[0] = ((numero * numero2) >> 32);

como posso tirar este warning ? Ou oq está acontecendo? Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que está acontecendo é que você está tentando deslocar mais do que o tamanho em bits do tipo.

Teu pc é 32 bits. Então você só pode deslocar até 31 bits.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas se eu puder então não tem problema? Mesmo com essse warning ?

 

OBS: apaguem os outros tópicos, a conexão da empresa aki é uma porcaria e acabou postando varias vezes

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por quê você quer deslocar 32 posições? 32 mod 32 = 0. Dá na mesma de um << 0.

 

#include <stdio.h>
int main() {
  int N1=2;
  printf("%d\n",N1<<32);
}

 

Saída: 2

 

http://answers.google.com/answers/threadview?id=388350

 

A barrel shifter is a combinational logic circuit with n data inputs,n data outputs, and a set of control inputs that specify how to shift the data between input and output. A barrel shifter that is part of a microprocessor CPU can typically specify the direction of shift (left or right), the type of shift (circular, arithmetic, or logical), and the amount of shift (typically 1 to n-1 bits, but sometimes 1 to n bits).

 

Warnings dizem que você pode fazer, mas corre o risco de ter dados errados por ir contra algum tipo de implementação (hardware ou software). Se o hardware de deslocamento for implementado com multiplexadores, p/ uma entrada de 4 bits você tem 2 entradas que controlam o comportamento do circuito. Um deslocamento de 5 bits precisa de 3 bits p/ ser representado, o que não vai caber.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então eu estou com um probleminha, estou implementando um mips e estou precisando implementar os registradores HI e LO, pesquisando achei que eles seriam desta maneira como propus acima, por isso tentei multiplicar inteiros e anexar em um double, mas também não deu certo.

 

preciso multiplicar 2 32bits e colocar em 64 bits, ou seja, em 2 registradores de 32 bits o resultado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tá.Eu estudei só 4 versões do algoritmo de multiplicação.

 

No primeiro você imita o algoritmo comum: são 32 repetições; o multiplicando é colocado num registrador de 64 bits; o multiplicador é um de 32bits e o produto tem 64 bits,inicializado com 0:

 

1. Se o bit 0 do multiplicador for 0, vá p/ o passo 2

1a. Se o bit 0 do multiplicador for 1,somar o multiplicando ao registrador do produto

2. Deslocar o multiplicando 1 bit à esquerda

3. Deslocar o multiplicador 1 bit à direita

4. 32a repetição? Sim: fim. Não:voltar ao passo 1

 

 

O segundo algoritmo divide o registrador de produto em duas partes; o multiplicando e o multiplicador são de 32 bits e a ULA é de 32 bits.

 

1.Se o bit 0 do multiplicador for 0, vá para o passo 2

1a. Se o bit 0 do multplicador for 1, adicionar o multiplicando à metade esquerda (os 32 bits mais significativos) do produto e colocar o resultado na metade esquerda do registrador do produto

2. deslocar o produto 1 bit à direita

3. deslocar o multiplicador 1 bit à direita

4. 32a repetição? Sim: Fim. Não: voltar ao passo 1

 

 

O terceiro aproveita os 32 bits menos significativos do Produto e coloca o multiplicador nesse espaço.

 

O 4o era o algoritmo de booth,que usa o registrador de produto inicializado com o multiplicando:

 

1. Se o bit 0 do produto for 0, va para o passo 2

1a. Se o bit 0 do produto for 1, somar o multiplicando à metade esquerda do produto e colocar o resultado na metade esquerda

2. deeslocar o produto em 1 bit à direita

3. 32a repeticao? Sim: Fim. Não: voltar ao passo 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei fazer mas naum consegui, o maximo que cheguei foi aki

 

int main()
{
	int multiplicando = 3;
	int multiplicador = 2;
	int j;
	int produto = 0;
	int p = 0;
	int h;
	for(h = 2; h > -1; h--)
	{
	  j = multiplicando >> h;
	  if(j == 0){
		produto >> p;
		p++;
	  } else{
		p = 0;
		j = multiplicador << p;
		produto += j;
	  }
	}
		printf("%d\n",produto);
	return 0;
}

tb to com uma extrema dor de cabeça

Compartilhar este post


Link para o post
Compartilhar em outros sites

#include <stdio.h>
struct S1 {
long long multiplicando;
long multiplicador;
long long produto;
};

long long mult1(int multiplicador, int multiplicando) {
struct S1 REGS;
REGS.produto = 0;
REGS.multiplicando = (long long)multiplicando;
REGS.multiplicador = (long)multiplicador;

int i;
for(i=0;i<32;i++) {
	if (REGS.multiplicador & 0x1 == 1)
		REGS.produto+=REGS.multiplicando;
	REGS.multiplicando = REGS.multiplicando<<1;
	REGS.multiplicador = REGS.multiplicador>>1;
}
return REGS.produto;
}

int main() {
int multiplicando, multiplicador;
scanf("%d %d",&multiplicando,&multiplicador);

printf("Resultado:%lld",mult1(multiplicador,multiplicando));
}

 

http://64.233.169.132/search?q=cache:Xyahx...lient=firefox-a

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado Isis, mas só tenho 1 duvida:

 

é necessario que um seja long e o outro long long (nem sabia q existia long long hehe)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.