Tipos de datos y operadores
Todo programa manipula datos almacenados en variables. El tipo de dato determina qué valores puede contener una variable, cuánta memoria ocupa y qué operaciones admite. Los tipos se dividen en primitivos (átomos que proporciona el propio lenguaje) y compuestos o estructurados (arrays/vectores, registros, objetos), que se construyen a partir de los primeros.
Tipos de datos primitivos en Java
Java define exactamente ocho tipos primitivos, identificados por palabras reservadas. Su tamaño es fijo e independiente de la plataforma:
| Tipo | Bits | Descripción |
|---|---|---|
byte | 8 | Entero con signo (-128 a 127) |
short | 16 | Entero con signo (-32.768 a 32.767) |
int | 32 | Entero con signo (-2³¹ a 2³¹-1) |
long | 64 | Entero con signo (-2⁶³ a 2⁶³-1) |
float | 32 | Coma flotante IEEE 754 simple precisión |
double | 64 | Coma flotante IEEE 754 doble precisión |
char | 16 | Carácter Unicode |
boolean | — | true / false |
Puntos que conviene fijar: para representar un short se necesitan 16 bits y para un int, 32 bits (es INCORRECTO afirmar lo contrario, es decir, que short use 32 y int 16). Un long requiere 64 bits y un double también 64 bits. Palabras como simple NO son tipos primitivos de Java. Tampoco lo son los arrays (vectores) ni String: son tipos de referencia/compuestos, aunque String reciba soporte especial del lenguaje.
Tipos en Python, PHP y Kotlin
En Python, los números enteros se representan con el tipo integrado int. La función hex() convierte un número decimal en su representación hexadecimal (cadena con prefijo 0x); análogamente bin() da binario y oct() octal. Python sobrecarga operadores sobre cadenas: la multiplicación repite la cadena y el + la concatena. Así, print("Java"*4+"Linux") imprime JavaJavaJavaJavaLinux (cuatro repeticiones de "Java" seguidas de "Linux").
En PHP, todas las variables comienzan con el símbolo $ (por ejemplo $edad = 25;); PHP es de tipado dinámico y no exige declarar el tipo por adelantado.
Kotlin introduce la seguridad de nulos (null safety): el sistema de tipos distingue entre referencias que pueden ser nulas (String?) y las que no (String), evitando en tiempo de compilación los errores de ejecución habituales por referencias nulas (NullPointerException).
Clasificación de operadores
Los operadores combinan valores (operandos) para producir un resultado. Las categorías presentes en la mayoría de lenguajes son:
-
Operadores aritméticos: realizan operaciones matemáticas (
+,-,*,/,%módulo). -
Operadores relacionales (o de comparación): comparan dos valores y devuelven un booleano (
==,!=,<,>,<=,>=). -
Operadores de asignación: asignan un valor a una variable (
=, y compuestos+=,-=…). -
Operadores lógicos:
&&(Y),||(O),!(NO), con evaluación de cortocircuito. -
Operadores de incremento/decremento:
++y--.
Operador ternario y precedencia
El operador condicional condición ? valor_si_verdadero : valor_si_falso evalúa una expresión booleana. Por ejemplo, en JavaScript con a = 10, b = 4, c = 4: la expresión (a + b) % 2 == 0 ? c + 4 : c - 2 calcula (14) % 2 == 0, que es verdadero, y devuelve c + 4 = 8.
Expresiones lógicas: evaluación paso a paso
Las expresiones booleanas combinan relacionales y lógicos. Ejemplos resueltos:
-
((a>=b) && !(c>a)) || (!(d>a))cona=3, b=3, d=5:a>=bes cierto y!(d>a)es falso; la expresión es cierta cuando!(c>a)lo sea, esto es, cuandocNO sea mayor que 3. Conc=1devuelve true. -
((a>b) && !(c>a)) || (!(d>a) && (c<d)): la combinacióna=2, b=6, c=6, d=2dafalseen ambos términos (nia>bnic<d), luego NO devuelve true. -
((a<b) && (c>a)) || (!(d>a) && (c>a))conb=2, d=8: cona=1, c=2el primer término (1<2y2>1) es cierto y devuelve true.
Incremento y decremento en C: prefijo vs. sufijo
En C (ANSI/ISO C) los operadores ++ y -- tienen dos formas con semántica distinta al usarse dentro de una asignación:
-
Prefijo (
--x,++x): primero modifica la variable y luego entrega el valor ya modificado. -
Sufijo (
x++,x--): entrega el valor actual y DESPUÉS modifica la variable.
Ejemplos verificados:
| Sentencia inicial | Operación | Resultado |
|---|---|---|
int x=5; int y=4; | y = --x; | x=4, y=4 |
int x=5; int y=3; | y = ++x; | x=6, y=6 |
int x=6; int y=2; | y = x++; | x=7, y=6 |
int a=11,b; | b = --a; | a=10, b=10 |
int a=11,b; | b = a--; | a=10, b=11 |
a = 6; | b = a++; | a=7, b=6 |
Una simple asignación directa copia el valor sin modificarlo: a = 4; b = a; deja ambos a 4; a = 12; b = a; deja ambos a 12. Y el mero y++; como sentencia aislada incrementa y (de 3 a 4) sin alterar x (que sigue en 5).
Secuencias de escape en C
Dentro de literales de cadena, la barra invertida \ inicia una secuencia de escape que representa un carácter de control:
| Escape | Significado |
|---|---|
\n | Nueva línea (salto de línea) |
\r | Retorno de carro (lleva el cursor al inicio de la línea) |
\b | Retroceso (backspace) |
\v | Tabulación vertical |
\t | Tabulación horizontal |
\0 | Carácter nulo |
Así, \r hace un retorno de carro, \b realiza un retroceso y \v se usa para la tabulación vertical.
Estructuras de datos compuestas
A partir de los primitivos se forman los vectores (arrays) —colecciones indexadas de elementos del mismo tipo— y los registros (structs) —agrupaciones de campos de tipos posiblemente distintos—. Estos NO son tipos primitivos, sino estructurados.
Fuentes
-
Oracle — The Java Tutorials, «Primitive Data Types»: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
-
Microsoft Learn — «Escape Sequences» (C language): https://learn.microsoft.com/en-us/cpp/c-language/escape-sequences
-
Python 3 — «Built-in Functions» (hex, bin, int): https://docs.python.org/3/library/functions.html
-
Python 3 — «Built-in Types» (str, int): https://docs.python.org/3/library/stdtypes.html
-
PHP Manual — «Variables Basics»: https://www.php.net/manual/es/language.variables.basics.php
-
Kotlin — «Null safety»: https://kotlinlang.org/docs/null-safety.html