Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

156
Visualizações
Operador bit a bit o usado en un operando de signo extendido en Visual Studio 2015

Intenté instalar Visual Studio 2015 y, al intentar compilar un proyecto antiguo, recibí la advertencia

CS0675 Bitwise-or operador utilizado en un operando de signo extendido; considere convertir primero a un tipo más pequeño sin firmar

para un fragmento de código que no da la misma advertencia al compilar en Visual Studio 2013. Descubrí que todo lo que se necesita para reproducir es este código muy simple:

 short a = 0; int b = 0; a |= (short)b;

Ahora, he leído esta pregunta SO , he leído la publicación de blog de Eric Lippert sobre este tema, y leí rápidamente sobre la extensión del signo , pero entiendo que la extensión del signo ocurre cuando emite desde un tipo de número firmado que consiste en un número más pequeño de bits a uno con mayor número de bits, como short a int por ejemplo.

Pero como estoy lanzando de int a short , no debería ocurrir ninguna extensión de signo si no me equivoco. El hecho de que esto no emita una advertencia en versiones anteriores de Visual Studio, me lleva a creer que debe ser un error en el compilador de Visual Studio 2015 (Roslyn). ¿Estoy malinterpretando cómo funciona la extensión de signo y/o el compilador aquí, o es más probable que se trate de un error del compilador?

Actualizar

Jon Skeet señaló que en realidad está ocurriendo una extensión de señal desde el | El operador no está definido para short , por lo que hay una conversión implícita a int antes de que el resultado vuelva a convertirse en short . Sin embargo, el compilador no debería haber emitido esta advertencia ya que el lanzamiento es inofensivo. Hubo un error en el compilador de Roslyn como se señaló en la respuesta aceptada.

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

La extensión de la señal está ocurriendo, pero posiblemente no por la razón obvia, y no de una manera preocupante, en mi opinión.

Este código:

 a |= (short) b;

es equivalente a:

 // No warning here... (surprisingly, given that `a` is being sign-extended...) a = (short) (a | (short) b);

Lo cual es equivalente a:

 // No warning here... a = (short) ((int) a | (int) (short) b;

porque el | El operador no está definido para operandos short de todos modos. Ambos operandos se promocionan a int , luego el resultado se convierte de nuevo a short .

No está claro por qué el compilador decide advertir en este caso, pero se está produciendo una extensión de señal... aunque de forma inofensiva.

Tenga en cuenta que recibe la misma advertencia si no hay variables int involucradas:

 short a = 10; short b = 20; a |= b; // CS0675

Dada la forma en que el | el operador trabaja con yesos, esto me parece completamente inofensivo. No estoy seguro de si lo llamaría un error del compilador, pero definitivamente me parece un comportamiento no ideal. Hará ping a los miembros del equipo compilador de C# para ver lo que me he perdido :)

over 4 years ago · Santiago Trujillo Relatório

0

Esto es solo un error. El código para detectar e informar este error se agregó muy tarde en el desarrollo de VS2015 (ver https://github.com/dotnet/roslyn/issues/909 y https://github.com/dotnet/roslyn/pull/2416 ) y detecta demasiados casos en comparación con VS2013. Ahora hay un informe de error ( https://github.com/dotnet/roslyn/issues/4027 ) para reparar esto.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda