2015-12-02 14 views
5

Ho un'immagine con larghezza 888px e altezza 592px, con proporzioni larghezza: altezza 3: 2.Visual Studio 2015 dice che il cast è ridondante. Perché?

quanto segue produce un valore errato di 1, a causa del calcolo integer/troncamento come BitmapDecoder.PixelWidth e BitmapDecoder.PixelHeight sono entrambi uint (intero senza segno), e decoder sotto essendo un oggetto BitmapDecoder.

double aspectRatio = decoder.PixelWidth/decoder.PixelHeight;

Di seguito si fornisce il corretto valore atteso di 1,5, ma Visual Studio dice 'Cast è ridondante', ma perché?

double aspectRatio = (double)decoder.PixelWidth/(double)decoder.PixelHeight;

+1

è necessario solo una (doppia) Cast - doppio/int = doppio. O int/double = double. – Dmitriy

+0

Il risultato sarà sempre un doppio se si divide un doppio con un qualsiasi tipo numerico. –

+0

'double aspectRatio = static_cast (decoder.PixelWidth)/decoder.PixelHeight;' dovrebbe essere sufficiente per far sì che il compilatore usi 'PixelHeight' come un doppio. – Pixelchemist

risposta

12

Hai solo bisogno di lanciare uno dei uints a raddoppiare per forzare l'aritmetica in virgola mobile quindi o:

double aspectRatio = decoder.PixelWidth/(double)decoder.PixelHeight; 

o:

double aspectRatio = (double)decoder.PixelWidth/decoder.PixelHeight; 

Personalmente, Andiamo con quest'ultimo, ma è una questione di opinione.

+1

Scarica! Un cast sarebbe stato sufficiente ma Visual Studio mi ha messo fuori strada. Spero che Visual Studio abbia lasciato da solo il primo cast e reso il secondo cast non necessario per essere assolutamente accurato. In questo senso Visual Studio è un po 'fuorviante, ma può essere spiegato perché. – user2921851

2

Giusto per completare @ risposta di ChrisF, si può vedere questo bene in codice IL, in cui un singolo cast double produrrà una conversione per entrambi i valori:

IL_0013: stloc.0  // decoder 
IL_0014: ldloc.0  // decoder 
IL_0015: callvirt UserQuery+Decoder.get_PixelHeight 
IL_001A: conv.r.un // convert uint to float32 
IL_001B: conv.r8  // convert to float64 (double) 
IL_001C: ldloc.0  // decoder 
IL_001D: callvirt UserQuery+Decoder.get_PixelWidth 
IL_0022: conv.r.un // convert uint to float32 
IL_0023: conv.r8  // convert to float64 (double) 
Problemi correlati