Aller au contenu

%UNS

Convertir en entier non signé

Convertit un nombre ou un texte en entier non signé. La partie décimale est supprimée, et une valeur négative fait planter le programme.

Syntaxe

%UNS(expression)
expression
Un nombre, une expression numérique ou une zone caractère contenant un nombre.
Résultat
Un entier non signé, la partie décimale étant coupée : 12,99 donne 12. Le maximum d'un uns(10) est 4294967295.

À quoi ça sert

Les compteurs, les tailles et les identifiants n'ont pas de signe. L'entier non signé double la plage de valeurs positives à taille égale : uns(10) va jusqu'à 4 294 967 295 là où int(10) s'arrête à 2 147 483 647.

Exemple 1 : Troncature, texte et valeur négative

**free
// %UNS : convertir en entier non signe (troncature) ; une valeur negative plante.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-ds pgmsts psds qualified;
  typ char(3) pos(40);
  num char(4) pos(43);
end-ds;
dcl-s prix    packed(7:2) inz(12.99);
dcl-s solde   packed(7:0) inz(-5);
dcl-s saisie  varchar(10) inz(' 250 ');
dcl-s nb      uns(10);

nb = %uns(prix);
snd-msg '12.99 devient  : [' + %char(nb) + ']';
snd-msg 'Texte " 250 "  : [' + %char(%uns(saisie)) + ']';
snd-msg 'Maximum uns(10): [' + %char(%uns(4294967295)) + ']';

monitor;
  nb = %uns(solde);
  snd-msg '-5 devient     : [' + %char(nb) + ']';
on-error *all;
  snd-msg '-5 plante      : ' + pgmsts.typ + pgmsts.num;
endmon;

*inlr = *on;

Résultat réel, compilé et exécuté sur IBM i 7.5 :

12.99 devient  : [12]
Texte " 250 "  : [250]
Maximum uns(10): [4294967295]
-5 plante      : MCH1210

12,99 devient 12, le texte ' 250 ' devient 250, et 4294967295 passe sans problème. En revanche %UNS(-5) ne peut pas être représenté : le programme s'arrête avec MCH1210, que l'on attrape ici avec un monitor.

Le piège

Un nombre négatif n'est pas ramené à zéro : il plante avec MCH1210. C'est vrai même pour -0,40, que la troncature ramènerait pourtant à zéro (voir la fiche %UNSH, qui le montre). Contrôlez le signe avant la conversion, ou entourez-la d'un monitor.