31 bits
En arquitectura de ordenadores, 31 bits es un adjetivo usado para describir enteros, direcciones de memoria u otras unidades de datos que comprenden hasta 31 bits (32 bits menos 1 sin utilizar/bit reservado) de ancho, o para referirse a una arquitectura de CPU y ALU basadas en registros, bus de direcciones o bus de datos de ese ancho.
Tal vez la única arquitectura de computadoras basada en direccionamiento de 31 bits es una de las más famosas y rentables. En 1983, IBM introdujo el direccionamiento de 31 bits en la arquitectura del mainframe IBM S/370-XA como una actualización del direccionamiento de 24 bits de los primeros modelos. Esta mejora permitía espacios de direcciones 128 veces mayores, permitiendo a los programas direccionar memoria por encima de 16 MiB.
En el IBM S/360 y las primeras arquitecturas del IBM S/370, las direcciones eran siempre almacenadas en palabras de 32 bits, pero las máquinas ignoraban los 8 bits superiores de la dirección resultando un direccionamiento de 24 bits. Con la extensión XA, ningún bit en la palabra se ignoraba.
La transición fue difícil: los programadores habían estado utilizando el byte de relleno para flags durante casi 20 años. IBM eligió soportar dos formas de direccionar para minimizar el dolor: si el bit más significativo de una dirección de 32 bits era 1, los siguientes 31 eran interpretados como direcciones virtuales. Si el bit más significativo era cero, entonces sólo los 24 bits más bajos eran tratados como direcciones virtuales (justo como con los sistemas pre-XA). Así, los programas podían continuar utilizando siete bits para otros propósitos siempre que pusieran a 0 el bit de mayor peso. Los únicos programas que requerían modificaciones eran los que utilizaban el bit de mayor peso e IBM ayudó a la transición con hardware dual durante un periodo de tiempo.
Ciertas instrucciones máquina en esta arquitectura de 31 bits alteraban el bit de modo de direccionamiento como un posible efecto colateral intencionado. Por ejemplo, la subrutina original BAL almacena cierta información de estado en el byte superior de las direcciones devueltas. Una instrucción BAS se añadió para soportar direcciones de 31 bits devueltas.
En los años 1990 IBM introdujo la arquitectura 370/ESA (después llamado 390/ESA y finalmente llamado IBM ESA/390 o System/390), completando la evolución a un direccionamiento virtual completo de 31 bits y manteniendo este flag de modo de direccionamiento. Notar que estas arquitecturas posteriores soportan más de 2 GiB de memoria física y múltiples espacios de direcciones concurrentes por encima de 2 GiB cada uno. A mediados de 2006 no había ya muchos programas excesivamente restringidos por esta arquitectura múltiple de 31 bits.
No obstante, IBM rompió la barrera del direccionamiento lineal de 2 GiB en 2000 con la introducción del primer sistema de 64 bits, la IBM zSeries Modelo 900. A diferencia de la transición con el XA, la z/Architecture no reserva un bit para identificar el código primitivo. Pero la z/Architecture mantiene la compatibilidad con código de 24 bits y de 31 bits, incluso código más antiguo ejecutándose concurrentemente con nuevo código de 64 bits.
Como el Linux/390 fue la primera versión del existente direccionamiento de 31 bits hardware en 1999, las aplicaciones mainframe iniciales sobre Linux compiladas en un modo pre-z/Architecture también estaban limitadas a un direccionamiento de 31 bits. Esta limitación desapareció con el hardware de 64 bits, el Linux de 64 bits en zSeries y aplicaciones Linux de 64 bits. Las distribuciones Linux de 64 bits siguen soportando programas de 31 bits.
La arquitectura IBM de 31 bits soporta almacenamiento expandido, permitiendo a código de 31 bits hacer uso de la memoria adicional. Sin embargo, en cualquier instante, un máximo de 2 GiB está en cada espacio de trabajo. Para Linux 31 bits es posible asignar memoria por encima de la barrera de los 2 GiB asignándola como si fuera un disco RAM.