Diferencias entre procesadores de x86 y x64

  • Los procesadores de 32 bits (x86) puede manejar un máximo de 4 gigabytes (2 ^ 32 = 4.294.967.296 bytes -> 4 gigabytes) de memoria RAM, mientras que un procesador con arquitectura de 64 bits (x64) puede tener hasta un máximo de 16 exabytes (2 ^ 64 = 18.446.744.073.709.551.616 -> 16 exabytes, 16 mil millones de gigabytes) de memoria RAM. Esto implica un incremento de las direcciones de memoria.
  • Un sistema con un procesador de 64 bits es capaz de mover el doble de información por ciclo de reloj (un hertz) que un sistema con un procesador de 32 bits. Este desplazamiento no significa que sea más rápido sino que mueve más datos en el mismo tiempo, aunque a veces esto también implica un aumento de la velocidad.
  • La información o variables de programa ocupa más si está desarrollado para sistemas o procesadores de 64 bits (8 bytes) que para 32 bits (4 bytes), con lo cual usando variables de 64 bits podremos trabajar con números más grandes (hasta 18.446.744.073.709.551.616) y los números más pequeños o con coma flotante serán mucho más precisos.

Ventajas de un sistema de 64 bits

  • Un procesador de 64 bits aumenta considerablemente el rendimiento al procesar mucha información o manejar archivos más grandes, como por ejemplo la edición de vídeo o fotos.
  • Los sistemas operativos de 64 bits son algo más rápidos que los de 32 bits, más estables y más seguros.
  • Un sistema operativo de 64 bits puede ejecutar tanto aplicaciones de 32 bits y 64 bits, mientras que un sistema de 32 bits solo puede ejecutar programas de 32 bits pero no de 64 bits. Los programas de 32 bits ejecutados en sistemas de 64 bits no incluyen ninguna mejoría, se ejecutan igual que si se tratase de un sistema de 32 bits. Pero no todos los software de 32 bits funcionan correctamente en sistemas de 64 bits.

Desventajas de un sistema de 64 bits

  • Un driver de 32 bits no puede ejecutarse en un sistema de 64 bits y la mayoría de los drivers desarrollados son para arquitecturas de 32 bits.
  • Para instalar un sistema de 64 bits se requiere un procesador de 64 bits también.
  • No son compatibles con programas de 16 bits o inferiores.
  • Algunos programas de 32 bits son incompatibles con sistemas de 64 bits.

Cantidad máxima de RAM soportada por las versiones de Windows

  • Windows XP Profesional (64 bits) -> 16Gb.
  • Windows Vista Home Basic (64 bits) -> 8Gb.
  • Windows Vista Home Premiun (64 bits) -> 16Gb.
  • Windows Vista (Resto de versiones) (64 bits) -> 128Gb.
  • Windows 7 Ultimate (32 bits) -> 4Gb.
  • Windows 7 Ultimate (64 bits) -> 192Gb.
  • Windows 7 Enterprise (32 bits) -> 4Gb.
  • Windows 7 Enterprise (64 bits) -> 192Gb.
  • Windows 7 Professional (32 bits) -> 4Gb.
  • Windows 7 Professional (64 bits) -> 192Gb.
  • Windows 7 Home Premium (32 bits) -> 4Gb.
  • Windows 7 Home Premium (64 bits) -> 16Gb.
  • Windows 7 Home Basic (32 bits) -> 4Gb.
  • Windows 7 Home Basic (64 bits) -> 8Gb.
  • Windows 7 Starte (32 bits) -> 2Gb.
  • Windows 7 Starte (64 bits) -> 2Gb.

Compilar para sistemas de 64 bits en C

En sistemas de 32 bits un número entero sin signo (unsigned long long) no puede superar 2 ^ 32, es decir, 4.294.967.296. Para esto necesitaríamos usar números de 64 bits.

Para indicar que una variable de 32 bits se trate como una de 64 bits se usa el sufijo L:

long long var_64bit = 1L;

Entero de 64 bits sin signo

Tipo: unsigned long long
Formato para la visualización: %llu
Sufijo para definir una constante: ULL

Ejemplo:

unsigned long long a = 4294967296ULL;
printf("%llu", a);

Entero de 64 bits con signo

Tipo: long long
Formato para la visualización: %llu
Sufijo para definir una constante: LL

Ejemplo:

long long a = 4294967296LL;
printf("%lld", a);

*Es necesario usar un sufijo (ULL o LL) ya que si por ejemplo escribimos:

unsigned long long a = 4294967296;

El compilador generara un error indicando que el número es demasiado grande para el tipo “long”, es decir, para un entero de 32 bits.
Esta noción esta directamente ligada a la arquitectura de los procesadores de 32 bits. Un registro de procesador de 32 bits es insuficiente, pero por defecto el compilador intentará poner los números en un solo registro. Sin embargo, con un sufijo como LL o ULL, el compilador almacenará el número en 2 registros, es decir en 64 bits.

Usar dos variables de 32 bits para almacenar un número de 64 bits

También podemos usar dos variables de 32 bits para almacenar valores de 64 bits.

int high_bits = (int) (var_64bit & 0xFFFFFFFFL);
int low_bits = (int) ((var_64bit >> 32) & 0xFFFFFFFFL);

Convertir dos números de 32 bits a uno de 64 bits

Para convertir las dos variables de 32 bits en una de 64 bits, juntando sus high_bits + low_bits:

long long var_64bit = (long long) (((unsigned long long) high_bits << 32) | (unsigned long long) low_bits);

Typedef

Lo más recomendable es usar los typedef definidos en las cabeceras (como stdint.h). Algunos de ellos son los siguientes:

typedef signed char 	<strong>int8_t</strong>
typedef unsigned char 	<strong>uint8_t</strong>
typedef signed int 	<strong>int16_t</strong>
typedef unsigned int 	<strong>uint16_t</strong>
typedef signed long int 	<strong>int32_t</strong>
typedef unsigned long int 	<strong>uint32_t</strong>
typedef signed long long int 	<strong>int64_t</strong>
typedef unsigned long long int 	<strong>uint64_t</strong>
...

Compilar programa en 64 bits

Finalmente debemos indicar al compilador la estructura a la que compilar nuestra aplicación.

Ejemplo del compilador GCC (linux):

gcc code.c -m64 (* -m32 para 32 bits) -o app_name

*Nota: Para compilar un programa en 64 bits debemos compilarlo en un sistema de 64 bits.

MÁS INFORMACIÓN

http://gcc.gnu.org
http://www.nongnu.org