2010-10-30 10 views
6

Me parece que no puede deshacerse de esta advertencia para la siguiente línea de código:Cómo para suprimir C CS0675 # advertencia: bit a bit-u operador utilizado en un operando de sesión extendida

d.word[wrdIndex++] = d.GetWord(english) | (ulong)i; 

la advertencia se aplica a el código después del operador de asignación. el método GetWord devuelve un ulong. Intenté lo siguiente en vano:

d.word[wrdIndex++] = (d.GetWord(english) | (ulong)i); 
d.word[wrdIndex++] = d.GetWord(english) | ((ulong)i); 
d.word[wrdIndex++] = ((ulong)d.GetWord(english)) | ((ulong)i); 

¿Alguien tiene alguna idea?

Respuesta

17

ACTUALIZACIÓN: Esta cuestión fue objeto de mi blog el lunes de noviembre de 29o 2010:

http://blogs.msdn.com/b/ericlippert/archive/2010/11/29/bit-twiddling-what-does-warning-cs0675-mean.aspx

Gracias por la gran pregunta!


a deshacerse de la advertencia por primera pensando en la advertencia y decidir si el compilador es el adecuado para llevar el problema a su atención en primer lugar! ¿De verdad obtendrá resultados incorrectos a nivel de bit o si la conversión de un tipo firmado a un signo de tipo sin signo más grande amplía el número entero?

Si la respuesta es , entonces su solución es incorrecta. No elimine la advertencia engañando al compilador para que continúe haciendo lo incorrecto sin darle la advertencia. Elimine la advertencia haciendo lo correcto: no use una conversión que firme el entero.

Si la respuesta es no , y usted quiere la extensión de signo, entonces su solución o la solución de Hans Passant es correcta. Sin embargo, pondría un comentario al respecto en el código, porque tal como está, es difícil ver que la extensión del letrero sea deseable.

+0

El código ciertamente hace lo que debería (y esta es la forma correcta de hacer lo que quiero en este caso, creo) - Estoy sorprendido de que el 2 de los 3 intentos: d.GetWord (inglés) | ((ulong) i) todavía entrega la advertencia cuando el ((ulong) i) se lanza a un ulong antes de que se aplique el operador O bit a bit, ¿verdad? –

+1

Ah, ahora lo entiendo, es bastante inteligente del compilador para advertirme sobre esto, supongo. ¿Hay alguna forma de convertir a ulong sin extensión de signo (que no sea enmascarando el bit superior manualmente)? –

+1

lanzados para unir primero. '(ulong) (uint) i' – CodesInChaos

2

siento, sólo se deshizo de él de esta manera:

ulong w = d.GetWord(english); 
ulong u = (ulong)i; 
d.word[wrdIndex++] = w | u; 
+0

Como se señaló anteriormente, si 'i' es negativo, su código se romperá (porque el resto de' u' contendrá 0xFFFFFFFF, por lo que el valor 'd.GetWord (inglés)' se perderá por completo en lugar de ser combinado con 'i'). – MrCranky

6
int i=-1;     // =   0xFFFFFFFF 
ulong u1=(ulong)i;  // = 0xFFFFFFFFFFFFFFFF 
ulong u1a=(ulong)(long)i; // = 0xFFFFFFFFFFFFFFFF 
ulong u2=(ulong)(uint)i; // = 0x00000000FFFFFFFF 

Por lo tanto, un molde de int a ulong corresponde al primer signo que se extiende a (firmado) de largo y luego descarta el signo.

Cuestiones relacionadas