Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

151
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda