2011-05-17 10 views
7

Saludos,C# - Valor constante '4294901760' no se puede convertir a un 'int'

no puedo creer que esté haciendo una pregunta tan básica, pero no tiene sentido lo que aquí está:)

En C# en Windows Phone 7/.net, estoy tratando de definir una constante en una clase de la siguiente manera:

// error CS0266: Cannot implicitly convert type 'uint' to 'int'. 
// An explicit conversion exists (are you missing a cast?) 
public const int RED = 0xffff0000; 

Si pongo un (int) colado a su alrededor como tal, me sale otro error:

// error CS0221: Constant value '4294901760' cannot be converted to a 'int' 
// (use 'unchecked' syntax to override)   
public const int RED = (int)0xffff0000; 

Pero sé que mi int es de 32 bits, por lo tanto tiene un rango de -2147483648 a 2147483647, ver http://msdn.microsoft.com/en-us/library/5kzh1b5w(v=vs.80).aspx

Entonces, ¿qué pasa?

¡Gracias de antemano!

porcina

Respuesta

16

Como nota, la gama de Int32 es -2147483648 a 2147483647, por lo que cualquier número dentro de ese rango se puede mantener, pero SÓLO números dentro de ese rango se puede mantener. 4.294.901.760 es mayor que 2.147.483.647, por lo que no cabe en un Int32.

Qué hacer al respecto depende de lo que desea lograr. Si lo que desea es un Int32 con el patrón de bits ffff0000, a continuación, como se sugiere el uso unchecked:

int y = unchecked((int)0xffff0000); 

y ahora tiene el valor -65536, que es el patrón de bits interpretado como un entero con signo.

¡Sin embargo! Si realmente quiere el valor 4,294,901,760, debe usar un tipo de datos apropiado para él, entonces UInt32.

+0

Sí, por supuesto. Debe llegar tarde Entonces ... si uso desmarcado, C# truncará el valor o lo ajustará, preservando los datos? – swinefeaster

+0

http://msdn.microsoft.com/en-us/library/a569z7k8%28v=vs.71%29.aspx. Entonces: en un contexto no verificado, si una expresión produce un valor que está fuera del rango del tipo de destino, el resultado se trunca. – VikciaR

+0

@Vik esa página es un poco engañosa (la última versión es mejor) - dado que los tipos de datos aquí son del mismo tamaño, en realidad no están 'truncados' – AakashM

4

int es un número entero con signo que va desde -2,147,483,648 a 2,147,483,647.
Lo que desea es un entero sin signo, es decir, uint, tal como lo indica el primer mensaje de error.

2

Intente utilizar sin control como se sugiere en el mensaje del compilador:

public const int RED = unchecked((int)0xffff0000); 

Esto define como RED -65536, que es interpretado como 0xffff0000 int firmado.

2
public const uint RED = 0xffff0000; 
1

Esto debe conseguir que todo el desenfrenado:

public const int RED = 0xffff << 16; 
Cuestiones relacionadas