Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Principio di conversione HRESULT
Forum - C# / VB.NET - Principio di conversione HRESULT

Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
Questo topic è stato chiuso dal moderatore

Ciao a tutti,
ho notato che se con il pinvoke importo AVIFileOpen e come tipo di ritorno imposto o UInt32 o Int32 ottengo risultati diversi (0 escluso).
Per esempio 2147762287 unsigned diventa -2147205009 signed.

Come avviene questa conversione? E' possibile riprodurla in C# o VB?

Ultima modifica effettuata da il 07/09/2011 alle 20:50
PM
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Up
3
Down
V
Segnala al moderatore
Postato alle 21:39
Mercoledì, 07/09/2011
Il valore restituito è l'esadecimale

8004406F

che corrisponde all'errore AVIERR_FILEOPEN

Quel valore è composto da tanti campi. Il primo bit a sinistra, il bit 31, è a 1 per indicare un errore (failure) e quindi, se interpretato come valore signed, è sempre negativo; se positivo, allora non è un errore.

A cosa ti serve la conversione?

Ultima modifica effettuata da nessuno il 07/09/2011 alle 21:41
Semplicemente : valore - 2^32 - nessuno - 07/09/11 21:49
Dovresti studiare il meccanismo con cui vengono rappresentati i valori interi negativi in binario (il complemento a due) - nessuno - 08/09/11 00:24
Se conosci il complemento a due, comprendi facilmente il meccanismo di conversione - nessuno - 08/09/11 07:09


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM
Avatar
tasx (Dev Team)
Expert


Messaggi: 439
Iscritto: 15/12/2008

Up
0
Down
V
Segnala al moderatore
Postato alle 21:44
Mercoledì, 07/09/2011
Ciao!

Questo avviene perchè un intero unsigned ha un range di valori che va da 0 a 4294967295,
mentre un int32 ha un range di valori che va da -2147483648 a 2147483647, quindi se tu converti un uint32 in int32 dove il primo è maggiore del valore massimo del secondo allora il tuo int32 andrà incontro ad un integer owerflow (qui è sicuramente spiegato meglio http://www.google.it/search?sourceid=chrome&ie=UTF-8&q=int ..., ovverò il tuo int32 assumera il valore minimo possibile per lui sommato alla differenza tra l'uint32 e l'int32.

Un esempio:

max_value_int32 + 1 = min_value_int32.

ciaociao!


supponiamo che tu hai questo uint32 = 3000000000 che è maggiore del valore massimo di un intt32 - tasx - 07/09/11 22:57


... sei un proxy che perde i pacchetti ...
PM
Avatar
tasx (Dev Team)
Expert


Messaggi: 439
Iscritto: 15/12/2008

Up
0
Down
V
Segnala al moderatore
Postato alle 11:23
Giovedì, 08/09/2011
Scusa per il commento incomprensibile, ma ho sbagliato cliccando invio, comunque....

Quello che io intendevo era il fatto che se tu hai un uint32 di valore =  3000000000 e lo converti in un int32, il tuo int32 finale non varrà 3000000000 ma sarà un numero negativo, perchè l'int32 non ha bit sufficienti per memorizzare un tale numero, quindi una volta che hai raggiunto il massimo valore(2147483647 = ((2^32) / 2) - 1) il tuo int32 "torna indietro" partendo dal suo minimo valore (-2147483648) ed avanza quanto basta per raggiungere 3000000000.

Ciaociao


... sei un proxy che perde i pacchetti ...
PM
Usa i commenti per chiedere spiegazioni o ringraziare le risposte.