%UINT 内置函数

%UINT 将字符,逻辑,十进制或整数数据转换为无符号整数格式。 可以将转换后的值分配给 CL 变量,将其作为数字常量传递给另一个程序或过程,或者将其指定为从编译的 CL 运行的 CL 命令的命令参数的值。

可在 CL 支持算术表达式的任何位置使用 %UINT 内置函数。 %UINT 可以单独使用,也可以作为更复杂的算术表达式的一部分使用。 例如,可以使用 %UINT 将十进制 CL 变量与 IFWHEN 命令的 COND 参数中的无符号整数 CL 变量进行比较。 如果关联的命令对象定义了具有 EXPR (*YES) 和 TYPE 为 *DEC , *INT2, *INT4, *UINT2或 *UINT4的参数,那么还可以使用 %UINT 来设置 CL 命令参数的值。

转换为无符号整数数据内置函数的格式为:
%UINT(convert-argument)
它还可以格式化为:
%UNS(convert-argument)

convert-argument 必须是 TYPE 为 *CHAR , *LGL , *DEC 或 *INT 的 CL 变量。

如果 convert-argument 参数是字符变量,那么以下规则适用:
  • 符号是可选的。 只能是 "+"。 它可以在数字数据之前或之后。
  • 小数点是可选的。 它可以是句点或逗号。
  • 数据中允许有前导和尾部空格。 例如, ' + 3 ' 是有效参数。
  • All-blank 值将返回零值。
  • 如果找到无效的数字数据,那么 CPF0818会发生异常。

结果将采用无符号整数格式,任何十进制数字都将截断而不进行四舍五入。 并且结果的大小始终为 4 字节。

以下是使用 %UINT 内置函数的示例:

注: * 允许 %UNS 与 RPG 兼容,但代码示例将使用 %UINT。
  • 转换字符变量
    DCL VAR(&POINTS) TYPE(*CHAR) LEN(10) VALUE('+123.45')
    DCL VAR(&ANSWER) TYPE(*UINT)
    
    /* &ANSWER will have the value 223 */
    CHGVAR VAR(&ANSWER) VALUE(100 + %UINT(&POINTS))
  • 转换逻辑变量
    DCL VAR(&ANSWER1) TYPE(*LGL) VALUE('1')
    DCL VAR(&ANSWER2) TYPE(*LGL) VALUE('1')
    DCL VAR(&NUM) TYPE(*UINT)
    
    /* &NUM will have the value 2. */
    CHGVAR VAR(&NUM) VALUE(%UINT(&ANSWER1) + %UINT(&ANSWER2))
    SNDPGMMSG MSG('The number of YES answers is' *BCAT %CHAR(&NUM)) 
  • 转换压缩十进制变量
    DCL VAR(&POINTS1) TYPE(*DEC) LEN(5 2) VALUE(100.23)
    DCL VAR(&POINTS2) TYPE(*DEC) LEN(5 2) VALUE(100.45)
    
    IF (%UINT(&POINTS1) *EQ %UINT(&POINTS2)) +
    THEN(SNDPGMMSG ('The scores are the same!'))
  • 转换整数变量
    DCL VAR(&P1) TYPE(*UINT) LEN(2)
    DCL VAR(&P2) TYPE(*INT) LEN(2) VALUE(1)
    
    CHGVAR VAR(&P1) VALUE(%UINT(&P2))
  • 十进制数字将在不舍入的情况下截断
    DCL VAR(&STRING) TYPE(*CHAR) LEN(10) VALUE('+123.9')
    DCL VAR(&ANSWER) TYPE(*UINT)
    
    /* &ANSWER will have the value 123 */
    CHGVAR VAR(&ANSWER) VALUE(%UINT(&STRING))