Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
07/09/11 18:48
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 07/09/11 18:50
07/09/11 19:39
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 07/09/11 19:41
07/09/11 19:44
tasx
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 google.it/…), 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!

aaa
08/09/11 9:23
tasx
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
aaa