Instrucciones:
1. 2. 3. 4.
5.
Identifica los tipos de datos manejados por C# y explica su definición, rango de valores y características. Identifica los operadores aritméticos, lógicos y relacionales y explica su definición, funcionalidad y características. Identifica las conversiones, explícitas e implícitas que puedes realizar Ejemplifica la aplicación de los tipos de datos en la declaración de variables y la utilización de los operadores aritméticos, relacionales y lógicos mediante segmentos de código, así como la relación entre las conversiones explícitas e implícitas. Organiza la información en una herramienta de tu preferencia: cuadro comparativo, cuadro sinóptico, esquema, diagrama, etcétera.
Tipos de datos comunes en C#
Tipo
sbyte
byte
short
ushort
int
uint
long
ulong
char
float
double
decimal
bool
datetime string
Descripción Las variables con tipo sbyte pueden contener números enteros de 8 bits con signo. La ‘s’ de sbyte significa 'con signo', lo que quiere decir que el valor de la variable puede ser positivo o negativo. El menor valor posible para una variable sbyte es 128 y el mayor es 127. Las variables con tipo byte pueden contener números enteros de 8 bits sin signo. A diferencia de las variables sbyte, las variables byte no tienen signo y sólo pueden contener números positivos. El valor más pequeño posible para un variable byte es O; el valor más alto es 255. Las variables con tipo short pueden contener números enteros de 16 bits con signo. El menor valor posible para un variable short es -32,768; el valor más alto es 32,767. Las variables con tipo ushort pueden contener números enteros de 16 bits sin signo. La 'u' de ushort significa sin signo. El menor valor posible para una variable ushort es O; el valor más alto es 65,535. Las variables con tipo in t pueden contener números enteros de 32 bits con signo. El menor valor posible para una variable int es -2,147,483,648; el valor más alto es 2,147,483,647. Las variables con tipo uint pueden contener números enteros de 32 bits sin signo. La 'u' en uint significa sin signo. El menor valor posible para una variable uint variable es O; el valor más alto posible es 4.294.967.295. Las variables con tipo long pueden contener números enteros de 64 bits con signo. El menor valor posible para una variable long es -9.223.372.036.854.775.808 el valor más alto es 9.223.372.036.854.775.807. Las variables con tipo ulong pueden contener números enteros de 64 bits sin signo. La 'u' en ulong significa sin signo. El menor valor posible para una variable ulong es O; el valor más alto es 18.446.744.073.709.551.615. Las variables con tipo char pueden contener caracteres Unicode de 16 bits. El menor valor posible para una variable char es el carácter Unicode cuyo valor es O; el valor más alto posible es el carácter Unicode cuyo valor es 65.535. Las variables con tipo float pueden contener un valor de coma flotante de 32 bits con signo. El menor valor posible para una variable float es aproximadamente 1.5 por 10 elevado a 45; el valor más alto es aproximadamente 3.4 por 10 elevado a 38. Las variables con tipo double pueden contener un valor de coma flotante de 64 bits con signo. El menor valor posible para una variable double es aproximadamente 5 por 10 elevado a 324; el valor más alto es aproximadamente 1,7 por 10 elevado a 308. Las variables con tipo decimal pueden contener un valor de coma flotante de 128 bits con signo. El menor valor posible para una variable decimal es aproximadamente 1 por 10 elevado a 28; el valor más alto es aproximadamente 7.9 por 10 elevado a 28. Las variables de tipo decimal son buenas para cálculos financieros. Las variables con tipo bool pueden tener uno de los dos posibles valores: true o falseo El uso del tipo bool es una de las partes en las que C# se aparta de su legado C y C++. En ellos, el valor entero O era sinónimo de false y cualquier valor que no fuese cero era sinónimo de true. Sin embargo, en C# los tipos no son sinónimos. No puede convertir una variable entera en su valor equivalente bool. Si quiere trabajar con una variable que necesita tener una condición verdadera o falsa, use una variable bool y no una variable int. Almacena un instante de tiempo que va comprendido desde 01/01/0001 12:00:00 am a 31/12/9999 11:59:59 pm Almacena una secuencia de caracteres
Tamaño de Memoria Utilizada 1 byte
1 byte
2 bytes
2 bytes
4 bytes
4 bytes
8 bytes
8 bytes
2 bytes
4 bytes
8 bytes
16 bytes
1 byte
8 bytes 2 bytes carácter
por
Los valores más pequeños pueden colocarse en variables de mayores tipos. Si un variable short puede contener valores desde -32.768 hasta 32.767, y una grande puede contener valores desde 9.223.372.036.854.775.808 hasta 9.223.372.036.854.775.807, entonces es evidente que todos los posibles valores short pueden ser almacenados en una variable long. El consumo de memoria. Una variable long puede contener valores más grandes, pero también necesita más memoria. Un variable short usa 16 bits (dos bytes), mientras que una grande usa 32 bits (cuatro bytes de memoria). Si va a trabajar con valores que no van más allá del límite de un variable short, use la variable short. Es una buena costumbre usar toda la memoria que necesite, pero no usar más de la necesaria.
Operadores
Estos operadores están puestos en orden de precedencia, es decir, e n el caso de haber una expresión con varios de ellos, se ejecutan por ese orden. Los operadores primarios son operadores de expresión. Operadores (expresión)
var++, var--
+
-
!
Uso
Tipo
Control de precedencia
Postincremento
Primario
y
postdecremento
Operando
en
forma
original
Cambio de signo
Primario
Unitario
Unitario
Not lógico
Unitario
Descripción En el caso de (expresión), los operadores son realmente los paréntesis. Sirven para modificar la precedencia y darle prioridad a la expresión que se encuentra dentro del paréntesis. Los operadores de incremento (++) y decremento (--) sirven para incrementar o disminuir el valor de una variable en una unidad. Esto lo realiza después de realizar cualquier operación. Por ejemplo: a = ++num; b = a--; Los operadores unitarios + y - sirven sencillamente para mantener o cambiar el signo de un operando. Si se desea mantener el signo de un operando sin cambios, el + se puede omitir. El operador - cambia el valor. En el siguiente ejemplo, como i valía 10, el valor que se guardaría en b sería -10. int i=10; int b=-i; ¡El operador unitario! es un not lógico, es decir, invierte el valor de un dato de tipo boolean. En el siguiente ejemplo, i valdría true y b valdría false: bool i=true; bool b=!i; Se utiliza para incrementar una variable, antes de realizar cualquier operación. Ejemplo:
++var, --var
Preincremento predecremento
y
Unitario
int a = 10; int b=++a; En este ejemplo, incrementaría a que vale 10 y después guardaría el valor 11 en b.
(conversión) var
Conversión de tipos
Unitario
*, /
Multiplicación, división
Binario
%
Resto de división
Binario
+, -
Suma, resta
Binario
<<, >>
Desplazamiento de bits
Binario
En el operador (conversion), lo que ha de ir entre paréntesis es el tipo al que se quiere convertir (int), (uint), (long)... Los operadores * y / son, respectivamente, para multiplicar y dividir. Es muy sencillo. Si, por ejemplo, tenemos la siguiente expresión: 4*6/2, el resultado sería el que se supone: 12. El operador % devuelve el resto de una división. Por ejemplo, 8 % 3 devolvería 2. Los operadores + y - (binarios) son para sumar o restar. 4+7-3 devolvería 8. Los operadores << y >> efectúan un desplazamiento de bits hacia la izquierda o hacia la derecha. Los operadores relacionales < (menor que), > (mayor que), <= (menor o igual que), >= (mayor o igual que), is, == (igual que), != (distinto de) establecen una comparación entre dos valores y devuelven como resultado un valor de tipo boolean (true o false). Veamos un ejemplo: int i; int b; Console.Write("Escribe el valor de i: "); i=Int32.Parse(Console.ReadLine()); Console.Write("Escribe el valor de b: "); b=Int32.Parse(Console.ReadLine());
<, >, <=, >=, is, ==, !=
Relacionales
Binario
Console.WriteLine("ib devuelve: {0}", (i>b)); Console.WriteLine("i>=b devuelve: {0}", (i>=b)); Console.WriteLine("i==b devuelve: {0}", (i==b)); Console.WriteLine("i!=b devuelve: {0}", (i!=b)); La salida de estas líneas de programa sería la siguiente (en rojo está lo que se ha escrito durante la ejecución de las mismas):
&&
AND lógico
Binario
Escribe el valor de i: 2 Escribe el valor de b: 3 ib devuelve: False i>=b devuelve: False i==b devuelve: False i!=b devuelve: True Los operadores && (AND lógico) y || (OR lógico) se ocupan de comparar dos valores de tipo boolean y retornan como resultado otro valor de tipo boolean. El operador && devuelve true cuando ambos operandos son true, y false cuando uno de ellos o los dos son false. Por ejemplo, la siguiente expresión devolvería true si un número es mayor que 10 y menor que 20:
||
OR lógico
Binario
(num > 10) && (num < 20) El operador || devuelve true cuando al menos uno de los operandos es true (pudiendo ser también true los dos), y false cuando los dos operandos son false. Suelen combinarse con las operaciones relacionales para establecer condiciones más complejas.
Para que veas otro ejemplo, la siguiente expresión devolvería true si el número es igual a 10 o igual a 20: (num == 10) || (num == 20) El operador?: (question) evalúa una expresión como true o false y devuelve un valor que se le especifique en cada caso (Si programabas en Visual Basic, equivale más o menos a la función iif). Vamos a verlo con un ejemplo: string mensaje = (num == 10)? "El número es 10" : "El número no es 10"; ?:
QUESTION
Binario
=, *=, /=, %=, +=, =, <<=, >>=, &=, ^=, |=
De asignación
Binario
Fíjate bien. Delante del interrogante se pone la expresión que debe retornar un valor boolean. Si dicho valor es true, el operador retornará lo que esté detrás del interrogante, y si es false retornará lo que esté detrás de los dos puntos. No tiene por qué retornar siempre un string. Puede retornar un valor de cualquier tipo. Por lo tanto, si en este ejemplo num valiera 10, la cadena que se asignaría a m ensaje sería "El número es 10", y en caso contrario se le asignaría "El número no es 10". El operador de asignación (=) (sí, sí, ya sé que nos hemos hartado de usarlo, pero vamos a verlo con más profundidad) asigna lo que hay a la derecha del mismo en la variable que está a la izquierda. Por ejemplo, la expresión a = b asignaría a la variable a lo que valga la variable b. La primera norma que no debes olvidar es que ambas variables han de ser compatibles. Por ejemplo, no puedes asignar un número a una cadena, y viceversa, tampoco puedes asignar una cadena a una variable de algún tipo numérico. El resto de operadores de asignación son operadores compuestos a partir de otro operador y el operador de asignación. Veamos a qué equivalen los operadores *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |= num *= 10; // Equivale a num = num * 10 num /= 10; // Equivale a num = num / 10 num %= 10; // Equivale a num = num % 10 num += 10; // Equivale a num = num + 10 num -= 10; // Equivale a num = num - 10 num <<= 10; // Equivale a num = num << 10 num >>= 10; // Equivale a num = num >> 10 num &= 10; // Equivale a num = num & 10 num ^= 10; // Equivale a num = num ^ 10 num |= 10; // Equivale a num = num | 10
La precedencia de operadores determina la prioridad con la que se ejecutan cuando hay varios de ellos en una misma expresión. Efectivamente, el resultado puede ser distinto en función del orden en que se ejecuten. Vamos con un ejemplo. La expresión 4 + 3 * 6 - 8 devolvería 14, ya que primero se hace la multiplicación y después las sumas y las restas. Si hubiéramos querido modificar dicha precedencia habría que haber usado paréntesis: (4+3) *6-8 devolvería 34, ya que primero se ejecuta lo que hay dentro del paréntesis, después la multiplicación y, por último, la resta.
La asociatividad de los operadores indica el orden en que se ejecutan cuando tienen la misma precedencia. Obviamente, esto es aplicable solamente a los operadores binarios. Todos los operadores binarios son asociativos por la izquierda salvo los de asignación, que son asociativos por la derecha. Por ejemplo, en la expresión 4+3+2, primero se hace 4+3 y a este resultado se le suma el dos, dado que el operador + es asociativo por la izquierda. Sin embargo, en la expresión b = c = d, como el operador de asignación es asociativo por la derecha, primero se asigna a c el valor de d, y después se asigna a b el valor de c, es decir, que tras esta expresión las tres variables valdrían lo mismo.
Conversiones de Tipo de C# Las conversiones de tipo de variables en C# se representan en la siguiente tabla en donde la fila es el origen y la columna el destino. Leyenda
Rojo Conversión incompatible (I). Verde Conversión automática o implícita (A). Azul
Conversión explícita (E).
Conversiones de tipo de datos byte sbyte short ushort int uint long ulong float double decimal char byte
E
boo l
A
A
A
A
A
A
E
E
E
E
I
A
E
A
E
A
A
E
E
E
E
I
E
A
A
A
A
E
E
E
E
I
A
A
A
A
E
E
E
E
I
E
A
A
E
E
E
E
I
A
A
E
E
E
E
I
E
E
E
E
E
I
E
E
E
E
I
A
E
I
I
E
I
I
I
I
sbyte
E
short
E
E
ushort
E
E
E
int
E
E
E
E
uint
E
E
E
E
E
long
E
E
E
E
E
E
ulong
E
E
E
E
E
E
E
float
E
E
E
E
E
E
E
E
double
E
E
E
E
E
E
E
E
E
decimal
E
E
E
E
E
E
E
E
E
E
char
E
E
E
A
A
A
A
A
A
A
A
bool
I
I
I
I
I
I
I
I
I
I
I
I I
Toda conversión implícita no ocasiona pérdida de información, truncamientos o redondeos. Es posible (pero no siempre ocurre) que en una conversión explícita haya pérdida de información, truncamientos o redondeos. En toda conversión implícita el tipo de dato destino es mayor que el tipo de dato origen. La conversión explícita se realiza indicando el tipo de dato al que se quiere convertir entre paréntesis, seguido del valor:
long valor = 123; // Conversión implícita long valor = (long)123; // Conversión explícita Además de realizarse dentro de una asignación, las conversiones de tipos también tienen lugar dentro de una expresión, pues en cada operación ambos operandos deben de ser del mismo tipo. Si la conversión es del tipo implícito se efectúa el siguiente algoritmo en dicho orden: 1. 2. 3. 4. 5. 6.
Si un operando es decimal, el otro operando se transforma a decimal. Si un operando es double, el otro operando se transforma a double. Si un operando es float, el otro operando se transforma a float. Si un operando es ulong, el otro operando se transforma a ulong. Si un operando es long, el otro operando se transforma a long. Si un operando es uint, y si el otro operando es de tipo sbyte, short o int, los dos se transforman a long. 7. Si un operando es uint, el otro operando se transforma a uint. 8. Si no es ninguno de los casos anteriores, los dos operandos se transforman a int.
Bibliografía: Ferguson, Jeff etal. La biblia de C#, Madrid, Ediciones Anaya Multimedia. Edición española, 2003. 835. http://es.wikipedia.org/wiki/C_Sharp http://www.mundonet.es/operadores.html?Pg=Entrega4.htm