Es muy sencillo de entender, si se asistieron a las clases que explicaban la matemática binaria.
El valor de 300.000 lo estás almacenando en dos variables. Una de tipo
int y otra de tipo
long. Por el resultado, que es el mismo, vemos que tanto una como otra realmente son el mismo tipo: un entero con signo de 32 bits.
¿Cómo es 300.000 en binario?
Using bash Syntax Highlighting
~$
> perl -E 'say unpack "B32", pack "N", 300_000'
00000000000001001001001111100000
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Pero... a la hora de imprimir los valores, estás usando
%d, que, normalmente, quiere decir que solo queremos imprimir un valor entero de simple precisión. Si estamos en una máquina con 32 bits, eso quiere decir que solo imprimirá un valor de 16 bits.
Si cogemos los 16 bits más bajos del valor anterior, nos queda:
1001001111100000
¿Qué valor es este? El 37.856. Pero el bit superior está puesto a 1, por lo que en realidad es un número negativo (recordemos que estamos con variables con signo). Entonces, en realidad es el 37856 - 65536 = -27680, que es el valor que sale en pantalla. Tu ordenador hace lo que le estás pidiendo
Prueba a cambiar
%d por
%ld, que es la forma de indicar que quieres imprimir valores "largos". Y si no vas a usar números con signo, indícalo también.