type - ulong en c#
Diferencia de dos ''uint'' (6)
Declarar una variable no asignada en C # no está marcada con un error; intentar asignar un valor no válido a una variable es. Por ejemplo, aquí hay una variable que no está definitivamente asignada (suponiendo que sea local) después de la declaración:
uint z;
-1 no es un valor válido para un uint más de 0.5, por lo que su ejemplo no se compilará.
Ahora, en cuanto al resto: los tipos de enteros simplemente envuelven el desbordamiento, al igual que al agregar 1 a int.MaxValue
devuelve int.MinValue
. Esta es una mejora significativa en el rendimiento en comparación con el hecho de que el programa verifique el desbordamiento de cada operación, a costa de no detectar un error.
Eso es solo si estás en un contexto sin marcar, ten en cuenta que si realizas cualquiera de estas operaciones en un contexto verificado, obtendrás una excepción. Por ejemplo;
class Test
{
static void Main()
{
checked
{
uint a = 5;
uint b = 6;
uint c = a - b;
}
}
}
Ejecuta eso y verás que se lanza una OverflowException
. Si eso es lo que desea para su proyecto completo, puede configurarlo en las propiedades del proyecto (o compilar con la opción de línea de comando /checked+
en csc
).
EDITAR: Vale la pena señalar que las otras respuestas han demostrado que puede poner cantidades menores de código en el contexto verificado: solo la declaración y asignación de c
o incluso solo el cálculo. Todo es bastante flexible.
Cuando intenta declarar una variable sin firmar en C # .NET con un valor fuera de su rango de valores, se marca como un error del compilador, pero si produce un valor negativo en el tiempo de ejecución y lo asigna a esa variable en tiempo de ejecución, el valor se ajusta.
uint z = -1; // Will not compile
uint a = 5;
uint b = 6;
uint c = a - b; // Will result in uint.MaxValue
¿Hay alguna buena razón para que las variables sin firmar se envuelvan en una situación así en lugar de arrojar una excepción?
Gracias.
El ajuste se debe a que por defecto C # está desactivado. Si agrega un bloque "verificado", se detectará el desbordamiento:
uint a = 3, b = 4;
checked
{
uint c = a - b; // throws an overflow
}
En cuanto al compilador, simplemente exige datos válidos.
Esto es solo lo predeterminado: puede cambiar la configuración de compilación para habilitar las comprobaciones de desbordamiento aritéticas en tiempo de ejecución. Si enciende eso, se lanzarán excepciones como espera. Alternativamente, puede activar la comprobación de una operación específica colocándola dentro de un bloque marcado.
uint c = checked(a - b);
Probablemente valga la pena aclarar aquí que uint
es un int sin firmar , no un int sin asignar . ¡Gran diferencia!
La razón por la que se envuelve en negativo se debe a la matemática Complemento de Dos que se usa para la aritmética de enteros.
La respuesta corta es que el bit más significativo se usa como el signo. Un cero es positivo; uno es negativo
Siempre usa doble La diferencia de rendimiento es insignificante, y es más flexible y complaciente. Esta práctica evita excepciones y reduce el tiempo de desarrollo. La gente anal lo odia sin embargo.