Ao deslocar para a esquerda, não há diferença entre aritmética e mudança lógica. Ao mudar para a direita, o tipo de deslocamento depende do tipo de valor que está sendo deslocado. (Como pano de fundo para aqueles leitores não familiarizados com a diferença, um deslocamento lógico direito por 1 bit desloca todos os bits para a direita e preenche o bit mais à esquerda com um 0. Uma mudança aritmética deixa o valor original no bit mais à esquerda. Importante ao lidar com números negativos.) Ao mudar um valor não assinado, o operador em C é uma mudança lógica. Ao deslocar um valor assinado, o operador é um deslocamento aritmético. Por exemplo, assumindo uma máquina de 32 bits: respondeu 11/08/08 às 9:16 Tão perto, Greg. Sua explicação é quase perfeita, mas mudar uma expressão de tipo assinado e valor negativo é definido pela implementação. Ver ISOIEC 9899: 1999 Seção 6.5.7. Ndash Rob Sep 22 08 às 22:53 Rob: Na verdade, para o deslocamento à esquerda e assinado número negativo, o comportamento é indefinido. Ndash JeremyP Apr 4 12 at 15:24 Na verdade, deslocamento à esquerda também resulta em comportamento indefinido para valores assinados positivos se o valor matemático resultante (que não é limitado no tamanho de bit) não pode ser representado como um valor positivo nesse tipo assinado. A linha inferior é que você tem que pisar com cuidado quando deslocamento direito um valor assinado. Ndash Michael Burr Jun 21 13 at 0:30 Primeiro é a diferença entre as mudanças lógicas e aritméticas de um ponto de vista matemático, sem se preocupar com o tamanho do tipo de dados. Deslocamentos lógicos sempre preenchem os bits descartados com zeros enquanto o deslocamento aritmético o preenche com zeros apenas para o deslocamento para a esquerda, mas para o deslocamento para a direita copia o MSB preservando assim o sinal do operando (assumindo uma codificação de dois complementos para valores negativos). Em outras palavras, a mudança lógica olha para o operando deslocado como apenas um fluxo de bits e move-los, sem se preocupar com o sinal do valor resultante. Mudança aritmética olha para ele como um número (assinado) e preserva o sinal como mudanças são feitas. Um deslocamento aritmético esquerdo de um número X por n é equivalente a multiplicar X por 2 n e é assim equivalente ao deslocamento esquerdo lógico um deslocamento lógico também daria o mesmo resultado desde MSB de qualquer maneira cai fora do fim e não há nada a preservar. Um deslocamento aritmético direito de um número X por n é equivalente a divisão inteira de X por 2 n SOMENTE se X é não negativo A divisão inteira é nada mais do que a divisão matemática e ronda em direção a 0 (trunc). Para números negativos, representados por dois complementos de codificação, o deslocamento para a direita por n bits tem o efeito de dividi-la matematicamente por 2 n e arredondamento em direção a (piso), assim o deslocamento à direita é diferente para valores não negativos e negativos. Para X 0, X n X 2 n trunc (X 2 n) para X lt 0, X n piso (X 2 n) onde é divisão matemática, é divisão inteira. Vejamos um exemplo: 37 2 18 (arredondamento 18,5 para 0) 10010) 2 resultado da mudança aritmética direita -37) 10 11011011) 2 (considerando um complemento de dois, representação de 8 bits) -37 2 -18 (arredondamento 18,5 para 0) 11101110) 2 NÃO é o resultado da mudança aritmética direita -37 1 -19 (arredondamento 18.5 para) 11101101) 2 resultado da mudança aritmética direita Como Guy Steele apontou. Esta discrepância tem levado a erros em mais de um compilador. Aqui não-negativo (matemática) pode ser mapeado para unsigned e assinado valores não-negativos (C) ambos são tratados da mesma e direita-deslocando-los é feito por divisão inteira. Assim, lógico e aritmético são equivalentes no deslocamento para a esquerda e para os valores não negativos no deslocamento direito seu deslocamento para a direita dos valores negativos que eles diferem. Tipos de operandos e de resultados Padrão C99 6.5.7: Cada um dos operandos deve ter tipos inteiros. As promoções inteiras são executadas em cada um dos operandos. O tipo do resultado é o do operando esquerdo promovido. Se o valor do operando direito for negativo ou for maior ou igual à largura do operando esquerdo promovido, o comportamento é indefinido. No snippet acima, ambos os operandos tornam-se int (devido à promoção de número inteiro) se E2 for negativo ou E2 sizeof (int) CHARBIT então a operação é indefinida. Isto é porque deslocando mais do que os bits disponíveis é certamente vai transbordar. Se R tivesse sido declarado curto. O resultado int da operação de deslocamento seria implicitamente convertido para curto uma conversão de estreitamento, o que pode levar a comportamento definido pela implementação se o valor não é representável no tipo de destino. Deslocamento para a esquerda O resultado de E1 ltlt E2 é E1 deslocado para a esquerda E2 bits posições desocupados bits são preenchidos com zeros. Se E1 tem um tipo não assinado, o valor do resultado é E12 E2. Reduzido módulo um mais do que o valor máximo representável no tipo de resultado. Se E1 tem um tipo assinado e um valor não negativo, e E12 E2 é representável no tipo de resultado, então esse é o valor resultante caso contrário, o comportamento é indefinido. Como os turnos à esquerda são os mesmos para ambos, os bits desocupados são simplesmente preenchidos com zeros. Em seguida, afirma que tanto para tipos não assinados e assinados é uma mudança aritmética. Im interpretá-lo como mudança aritmética desde mudanças lógicas não se preocupam com o valor representado pelos bits, ele só olha para ele como um fluxo de bits, mas o padrão fala não em termos de bits, mas definindo-o em termos do valor obtido por O produto de E1 com 2 E2. A advertência aqui é que para tipos assinados o valor deve ser não negativo eo valor resultante deve ser representável no tipo de resultado. Caso contrário, a operação é indefinida. O tipo de resultado seria o tipo do E1 após a aplicação de promoção integral e não o tipo de destino (a variável que vai manter o resultado). O valor resultante é implicitamente convertido para o tipo de destino se não for representável nesse tipo, então a conversão é definida pela implementação (C99 6.3.1.33). Se E1 é um tipo assinado com um valor negativo, então o comportamento do deslocamento esquerdo é indefinido. Este é um caminho fácil para um comportamento indefinido que pode ser facilmente ignorado. Deslocamento à Direita O resultado de E1 E2 é E1 posições de bit E2 deslocadas para a direita. Se E1 tem um tipo não assinado ou se E1 tem um tipo assinado e um valor não negativo, o valor do resultado é a parte integral do quociente de E12 E2. Se E1 tem um tipo assinado e um valor negativo, o valor resultante é definido pela implementação. Deslocamento para a direita para unsigned e assinado valores não negativos são bastante direto os bits vagas são preenchidos com zeros. Para valores negativos assinados, o resultado do deslocamento para a direita é definido pela implementação. Dito isto, a maioria das implementações como o GCC eo Visual C implementam o deslocamento direto como mudança aritmética, preservando o bit de sinal. Conclusão Ao contrário de Java, que tem um operador especial gtgtgt para mudança lógica além do gtgt usual e ltlt. C e C têm apenas deslocamento aritmético com algumas áreas deixadas indefinidas e definidas pela implementação. A razão que eu os considero como aritmética é devido à linguagem padrão da operação matematicamente ao invés de tratar o operando deslocado como um fluxo de bits esta é talvez a razão pela qual deixa essas áreas desimplementação definida em vez de apenas definir todos os casos como mudanças lógicas. Em termos do tipo de mudança que você começa, o importante é o tipo de valor que você está mudando. Uma fonte clássica de bugs é quando você muda um literal para, digamos, mascarar bits. Por exemplo, se você quiser soltar o bit mais à esquerda de um inteiro não assinado, então você pode tentar isso como sua máscara: Infelizmente, isso irá colocá-lo em problemas porque a máscara terá todos os seus bits definidos porque o valor está sendo deslocado (0) é assinado, assim um deslocamento aritmético é executado. Em vez disso, você deseja forçar uma mudança lógica declarando explicitamente o valor como não assinado, ou seja, fazendo algo como isto: Bem, eu olhei para cima na wikipedia. E eles têm isto a dizer: C, no entanto, tem apenas um operador de shift direito,. Muitos compiladores C escolher qual deslocamento à direita para executar, dependendo do tipo de inteiro está sendo deslocado frequentemente inteiros assinados são deslocados usando o deslocamento aritmético e inteiros não assinados são deslocados usando o deslocamento lógico. Então parece que depende do seu compilador. Também nesse artigo, observe que o deslocamento à esquerda é o mesmo para a aritmética e lógica. Eu recomendaria fazer um teste simples com alguns números assinados e unsigned no caso da beira (jogo elevado do bocado naturalmente) e ver o que o resultado é em seu compilador. Gostaria também de recomendar evitar dependendo de ser um ou outro, uma vez que parece C não tem padrão, pelo menos se é razoável e possível evitar tal dependência. Embora a maioria dos compiladores C costumava ter um deslocamento esquerdo aritmético para valores assinados, esse comportamento útil parece ter sido depreciado. A filosofia atual do compilador parece assumir que o desempenho de um deslocamento para a esquerda em uma variável autoriza um compilador a assumir que a variável deve ser não-negativa e, portanto, omitir qualquer código em outro lugar que seria necessário para o comportamento correto se a variável for negativa . Ndash supercat Apr 16 15 at 5:47 Left shift ltlt Isso é de alguma forma fácil e sempre que você usar o operador shift, é sempre uma operação bit-wise, por isso não podemos usá-lo com uma operação de duplo e float. Sempre que deixamos o shift um zero, ele sempre é adicionado ao bit menos significativo (LSB). Mas no turno para a direita temos que seguir uma regra adicional e essa regra é chamada de bit de sinal. Significado de cópia de bit de sinal é se o bit mais significativo (MSB) é definido, em seguida, após um deslocamento à direita novamente o MSB será definido se ele foi redefinido, então ele é novamente redefinir, significa que se o valor anterior era zero e depois de mudar novamente, Bit é zero se o bit anterior era um então após a mudança é novamente um. Esta regra não é aplicável para um deslocamento para a esquerda. O exemplo mais importante no deslocamento para a direita se você muda qualquer número negativo para o deslocamento para a direita e, em seguida, depois de algum deslocamento o valor finalmente chegar a zero e, em seguida, após este se deslocar este -1 qualquer número de vezes o valor permanecerá igual. Por favor, verifique. Respondeu Mar 30 14 at 11: 04Right agora estou lendo o livro Computer Systems. Perspectiva Do Programador. Um problema no livro diz para executar uma mudança lógica direita em um inteiro assinado, eu não consigo descobrir como começar sobre isso. A seguir está a questão real do livro. Preencha o código para as seguintes funções C. A função srl executa um deslocamento lógico à direita usando um deslocamento aritmético à direita (dado pelo valor xsra), seguido por outras operações que não incluem mudanças de direita ou divisão. A função sra executa um deslocamento aritmético à direita usando um deslocamento lógico direito (dado pelo valor xsrl), seguido por outras operações que não incluem desvios ou divisão à direita. Você pode usar o cálculo 8sizeof (int) para determinar w, o número de bits no tipo de dados int. A quantidade de mudança k pode variar de 0 a w 1. Espero que você entenda agora a pergunta. Perguntou Jul 27 13 at 3:18 Eu não vou dar uma resposta completa como este é, aparentemente, lição de casa, mas Ill dar-lhe algumas dicas para ajudá-lo a trabalhar para si mesmo: para uma mudança lógica direita de N bits que você precisa para limpar o topo N bits do resultado após a mudança aritmética você pode limpar bits em um valor, aplicando uma máscara adequada. Normalmente usando um AND bit a bit ou XOR para limpar os N bits superiores de um valor que você precisa de uma máscara com N 0s e restantes bits 1 você pode gerar uma máscara adequada usando deslocamento à esquerda por W - N bits, onde W é o número de bits em Uma palavra (que você pode calcular como W sizeof (int) CHARBIT) Para um deslocamento lógico direito por 3 A parte mais complicada é gerar a máscara, mas se você pensar em deslocamentos esquerdos aplicados para um valor adequado, talvez seguido por uma operação mais bit a bit, você deve em breve ver uma solução bastante simples. Representação correta para -164 Não. O resultado representa um grande número positivo, não -4 Deslocamento Aritmética Direita Um deslocamento direto lógico não pode ser usado para dividir um número inteiro negativo por dois. O problema é que um deslocamento direto lógico move zeros para o bit de alta ordem. Isto é desejável em algumas situações, mas não para dividir números inteiros negativos onde o bit de ordem superior é o bit de sinal. Um deslocamento direito aritmético replica o bit de sinal conforme necessário para preencher posições de bit: PERGUNTA 13: Existe uma necessidade de uma instrução de mudança de turno aritmética
Fácil Mercados MT4 Troque na plataforma worldsquos mais popular e obtenha os benefícios do easyMarkets e um alto nível de suporte pessoal. Obtenha o melhor dos dois mundos. Popular em todo o mundo, a plataforma de negociação MetaTrader 4 (MT4) da MetaQuotes fornece um ambiente estável, familiar e confiável no qual comercializar facilmente os mercados. Nossos negociantes easyMarkets MT4 desfrutam de acesso a uma variedade de produtos e mercados. Como uma primeira opção, as opções no MT4, mais pontos forex, índices, produtos agrícolas e energéticos CFDs, todos com nossos altos níveis de serviço e suporte. Nosso easyMarkets MT4 é, portanto, a plataforma ideal para aqueles que já estão familiarizados com o MT4, para Money Managers usando MT4 MultiTerminal, investidores interessados em autotrading e aqueles que preferem usar uma seleção de gráficos de análise técnica avançada. MetaTrader 4 destaca 150 mercados incluindo moedas, metais, commodities, índices e opções de baunilha Diferenciai
Comments
Post a Comment