Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. 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: 6402
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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
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
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

PM
Usa i commenti per chiedere spiegazioni o ringraziare le risposte.