%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.