Ver Mensaje Individual
  #6 (permalink)  
Antiguo 01/02/2013, 05:38
Avatar de dontexplain
dontexplain
 
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 12 años, 6 meses
Puntos: 127
Respuesta: Duda antes de trabajar en C y q no aparece en ningun sitio

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

Código C:
Ver original
  1. double a = 999.0;
  2. double b = a/3;

El compilador lo traduce automáticamente a
Código ensamblador:
Ver original
  1. movsd       xmm0,mmword ptr ds:[0C85868h]  
  2.  movsd       mmword ptr [a],xmm0
  3.  movsd       xmm0,mmword ptr [a]  
  4.  divsd       xmm0,mmword ptr ds:[0C85858h]  
  5.  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.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor

Última edición por dontexplain; 01/02/2013 a las 05:50