Los tipos de datos subrango, son rangos de valores, que se deben definir a partir de un tipo de dato enumerado, números Enteros o el tipo de dato char. Los subrangos se declaran, separando con dos puntos seguidos los datos que determinan el inicio y final del intervalo. Los valores que se asignen a un tipo de dato subrango, deben estar comprendidos en el intervalo durante la ejecución del programa. A continuación un ejemplo:
Las rutinas read y readln no trabajan con variables que usen subrangos de tipos de datos enumerados, como el tipo de dato DiaSemana. En el ejemplo anterior se puede hacer lectura de la variable m, ya que sus datos son subrango del tipo de dato char Mayusculas. Sólo se pueden crear subrangos de números enteros, desde -9223372036854775808 hasta 9223372036854775807, que es el rango usado para el tipo de dato int64. Los tipos de datos longint, integer, shortint, byte y word son definidos como subrangos del tipo de dato int64. Las rutinas read y write se pueden usar con subrangos de números enteros y del tipo de dato char . Los subrangos de números enteros también se pueden definir usando valores hexadecimales. Ejemplo:
Los subrangos de tipo char están limitados a usar sólo caracteres ASCII, cuando los códigos fuente se escriben en UTF8, pero se pueden crear subrangos mayores al rango permitido por las caracteres ASCII usando el símbolo #, que nos permite usar rangos mayores a #127, tanto en decimal como hexadecimal.
Pero a las variables que usen este subrango, sólo se les puede asignar caracteres entre comillas simples a los subrangos comprendidos entre #0 y #255, o un rango menor al indicado. Ejemplo:
Se debe tener en cuenta, que las variables que usen subrangos comprendidos entre #0 y #255, se comportará como un tipo de dato char, pero cuando las variables usen subrangos mayores a #255, el comportamiento será como el de un subrango de número enteros, es por eso que no se puede asignar € y ~, a la variable c que usa el subrango ULetras, y sólo se pueden asignar números enteros.
Cuando se definen subrangos que usen caracteres en UTF8 mayores a #127, como por ejemplo:
NCirculos='➀'..'➉';
AELetras='!'..'ÿ';
Se considerarán estos subrangos, como subrangos de números enteros de dos bytes. Es decir el rango de NCirculos en UTF8 sería desde $E29E80 hasta $E29E89, el compilador lo convertirá a su equivalente UTF16, es decir el rango sería desde $2780 hasta $2789, que son números de 2 bytes y se considerarán como un subrango de números enteros, lo mismo sucede con AELetras en donde el rango sería desde $21 hasta $C3BF en UTF8, y su equivalente en UTF16 sería desde $0021 hasta $00FF, pero como $FF=#255, es mayor a #127 entonces, el compilador lo considerará como un subrango de números enteros de 2 bytes y no de 1 byte. Ejemplo: