En informática, un sobrepunzón con signo es un esquema de codificación que almacena el signo de un número cambiando (normalmente) el último dígito. Se utiliza en datos de caracteres en mainframes IBM mediante lenguajes como COBOL , PL/I y RPG . [1] Su propósito es guardar un carácter que de otro modo sería utilizado por el dígito del signo. [2] El código se deriva del Código de tarjeta perforada de Hollerith , donde se pueden introducir tanto un dígito como un signo en la misma columna de la tarjeta. Se denomina sobrepunzón porque el dígito de esa columna tiene un punzón de 12 o de 11 encima para indicar el signo. Las tres primeras filas de la tarjeta se denominan punzones de zona , [3] y, por tanto, los datos de caracteres numéricos que pueden contener sobrepunzones se denominan decimales zonificadas .
En la terminología de IBM, los cuatro bits de orden inferior de un byte en almacenamiento se denominan dígito y los cuatro bits de orden superior son la zona . [4] Los bits de dígito contienen el valor numérico 0–9. Los bits de zona contienen 'F'x, formando los caracteres 0–9, o la posición de carácter que contiene la sobrepunción contiene un valor hexadecimal que indica un valor positivo o negativo, formando un conjunto diferente de caracteres. (Las zonas A, C, E y F indican valores positivos, B y D negativos).
La PACK
instrucción en las máquinas con arquitectura IBM System/360 convierte el signo de un número decimal zonificado al convertirlo a decimal empaquetado , y la UNPK
instrucción correspondiente establecerá el signo sobrepuncionado correcto de su salida decimal zonificada. [5]
PL/I utiliza el PICTURE
atributo para declarar datos decimales zonificados con una sobrepunción con signo. Cada carácter en una imagen numérica, excepto V
, que indica la posición del punto decimal supuesto, representa un dígito. Un carácter de imagen de T
, I
o R
indica una posición de dígito que puede contener una sobrepunción. T
indica que la posición contendrá {–I si es positivo y {–R si es negativo. I
indica que la posición contendrá {–I si es positivo y 0-9 si es negativo. R
indica que la posición contendrá 0–9 si es positivo y {–R si es negativo.
Por ejemplo, PICTURE 'Z99R'
describe un campo numérico de cuatro caracteres. La primera posición puede estar en blanco o contener un dígito del 0 al 9. Las dos posiciones siguientes contendrán dígitos y la cuarta posición contendrá del 0 al 9 para un número positivo y {–R para un número negativo. [6]
Asignar el valor 1021 a la imagen de arriba almacenará los caracteres "1021" en la memoria; asignar -1021 almacenará "102J".
COBOL utiliza el carácter de imagen 'S' para USAGE IS DISPLAY
los datos sin SIGN IS SEPARATE CHARACTER
para indicar una perforación adicional. SIGN IS LEADING
indica que la perforación adicional está sobre el primer carácter del campo. SIGN IS TRAILING
, lo ubica sobre el último carácter. SIGN IS TRAILING
es el valor predeterminado. [7]
El lenguaje C no tiene ninguna disposición para decimales con zonas. El compilador IBM ILE C/C++ para System i proporciona funciones para la conversión entre int
or double
y decimales con zonas: [8]
10} es -100
45A es 451
La representación de caracteres con signo de sobrepunción "no está estandarizada en ASCII, y los distintos compiladores utilizan distintos códigos de sobrepunción". En algunos casos, "la representación no es la misma que el resultado de convertir un campo con signo EBCDIC a ASCII con una tabla de traducción". [10] En otros casos son iguales, para mantener la compatibilidad de los datos de origen en caso de pérdida de la conexión entre el código del carácter y el dígito correspondiente.
Un campo negativo EBCDIC que termina con el dígito '1' codificará ese dígito como 'D1'x, 'J' mayúscula, donde el dígito es '1' y la zona es 'D' para indicar un campo negativo. La 'J' mayúscula ASCII es '4A'x, donde el valor hexadecimal no guarda relación con el valor numérico. Una codificación alternativa utiliza 'q' minúscula, '71'x, para esta representación, donde el dígito es '1' y la zona es '7'. Esto preserva el dígito y la secuencia de cotejo a costa de tener que reconocer y traducir campos con perforaciones de forma individual.
Gnu COBOL y MicroFocus COBOL utilizan letras minúsculas de la 'p' a la 'y' para representar los números negativos del '0' al '9'. [11] [12]
Los compiladores PL/I en sistemas ASCII utilizan el mismo conjunto de caracteres ({, J–R) que EBCDIC para representar perforaciones superpuestas. [13]