2010-09-01 12 views
21

Un tipo di dati UInteger contiene qualsiasi valore compreso tra 0 e 4.294.967.295 (riferimento MSDN).Perché l'assegnazione di 0xFFFFFFFF a un UInteger genera un errore in VB.NET?

Se provo questo codice in VB.NET, ottengo un errore di compilazione:

Dim Test As UInteger = &HFFFFFFFF 

Error: "Constant expression not representable in type 'UInteger'.

Perché non riesco a impostare 0xFFFFFFFF (4294967295) per un UInteger se questo tipo può contenere questo valore ?

risposta

25

Credo che sia perché il letterale &HFFFFFFFF viene interpretato dal compilatore VB.NET come Integer, e tale valore per un Integer è un numero negativo (-1), che ovviamente non può essere fuso ad una UInteger.

Questo problema viene risolto facilmente scrivendo &HFFFFFFFFUI, aggiungendo il suffisso UI per trattare il valore letterale come UInteger.

+1

Wow. Solo ... wow. – Thanatos

8

è possibile utilizzare il MaxValue costante:

Dim Test As UInteger = UInteger.MaxValue 
2

Guardando this article, sembra che la soluzione è quella di impostare il valore come & HFFFFFFFFUI, dal momento che secondo l'articolo:

If you just write &HFFFFFFFF then it is treated as a signed 32 bit integer, value is -1, and you can't assign that to a UInteger.

If you write &HFFFFFFFFL then it is treated as a signed 64 bit integer, now the binary is: 0000000000000000000000000000000011111111111111111111111111111111

+4

Il suffisso corretto per 'UInteger' sarebbe' UI' o 'ui', quindi in questo esempio' & HFFFFFFFFui' dovrebbe essere preferito a 'L' perché con' L' è richiesta una conversione restringimento. –

+0

Grande intuizione. Ho aggiornato la parte in grassetto di conseguenza. L'articolo (forum) aveva pochi anni. –

+0

Questa risposta non ha più senso. Citi e citi un articolo, a sostegno di una soluzione completamente diversa che proviene da un commento. –

0

inciso , non vale niente che "LongValue = LongValue And Not & h8000" cancella solo un bit in "LongValue", così come "LongValue = LongValue A" nd Non & h800000000000 ". D'altra parte, "LongValue = LongValue And Not & h80000000" cancellerà i primi 33 bit di LongValue.

-1

È possibile scrivere "-1" che è lo stesso di 4,294,967,295

Problemi correlati