C es una implementación de alto nivel de ensamblador. Prácticamente toda la lógica ( o casi toda) es lógica numérica que es procesada por la misma CPU. Las operaciones lógicas de una CPU tradicional no se reducen a operaciones matemáticas simples, hay operaciones matemáticas extendidas, para E/S, binarias, etc. Todo lo que puede realizarse en C es meramente una forma abreviada de realizar esas mismas operaciones de bajo nivel.
Por ejemplo, si escribes este código
El compilador lo traduce automáticamente a
Código ensamblador:
Ver originalmovsd xmm0,mmword ptr ds:[0C85868h]
movsd mmword ptr [a],xmm0
movsd xmm0,mmword ptr [a]
divsd xmm0,mmword ptr ds:[0C85858h]
movsd mmword ptr [b],xmm0
Lo primero y más notable es el uso de regístros XMM de 16 bytes en lugar de los tradicionales eax, ebx, ecx de apenas 4 bytes donde una variable
double de 8 bytes no tendría sitio. Luego, en lugar de usar la operación
div de la CPU para realizar la división convencional si fuera un entero usa obligadamente
divsd que no hace más que una operación de división entre números de punto flotante de doble precisión, o sea, entre números de 8 a 16 bytes usando los regístros XMM de 16 bytes o cualquier otro de 8 bytes para almacenar el resultado. Luego usa movsd en lugar de un mov tradicional para mover tal entero a un regístro.
Finalmente almacena el resultado en la RAM convencional pero como un puntero mmword de 8 bytes, ya que es tontería usar un doubleword de 16 bytes (xmmword ptr) si una variable double ocupa 8 bytes.
Entonces queda como:
1. Usa registros de 16 bytes en lugar de registros de 4 porque double ocupa 8 bytes y un registro de una CPU tiene un máximo de 4 bytes.
2. Usa las operaciones de la CPU para mover datos (movsd), dividir números (divsd) en lugar de los tradicionales
mov y
div.
3. Usa punteros especiales y tipos de datos distintos a los comunes como
byte,
word o
dword o
qword por los propios de XMM que son
mmword y
xmmword.
Todo se reduce a operaciones matemáticas más o menos elementales.
Cuando escribes int y respondiendo a tu pregunta, por supuesto, son tipos simulados.
int es un entero de 4 bytes. char es un entero de 1 byte. La CPU no maneja tipos de datos, sólo maneja números, los tipos se refieren al espacio que ocupan en la memoria, y ahí se refieren como byte, word, dword ó qword. Cuando almacenas una variable char es una forma breve de decir una
variable de 1 byte, luego, en cualquier caso, siempre almacenará números, y en cualquier caso esos números no son más que máscaras de bits.
Un saludo.