Datatype promotion when evaluating numeric
expressions
Order of precedence
The PowerBuilder numeric datatypes are listed here in order of
highest to lowest precedence (the order is based on the range of
values for each datatype):
| Double |
| Real |
| Decimal |
| LongLong |
| UnsignedLong |
| Long |
| UnsignedInteger |
| Integer |
| Byte |
Rules for type promotion
Datatypes of operands
If operands in an expression have different datatypes, the value
whose type has lower precedence is converted to the datatype with
higher precedence.
Unsigned versus signed
Unsigned has precedence over signed, so if one operand is signed
and the other is unsigned, both are promoted to the unsigned version
of the higher type. For example, if one operator is a long and another
UnsignedInteger, both are promoted to UnsignedLong.
Operators
The effects of operators on an expression’s datatype are:
-
+, -, *
The minimum precision for addition, subtraction, and
multiplication calculations is long. Integer types are promoted to
long types before doing the calculation and the expression’s
resulting datatype is, at a minimum, long. When operands have
datatypes of higher precedence, other operands are promoted to
match based on the Datatypes of operands rule above. -
/ and ^
The minimum precision for division and exponentiation is
double. All types are promoted to double before doing the
calculation, and the expression’s resulting datatype is
double. -
Relational
Relational operators do not cause promotion of numeric
types.
Datatypes of literals
When a literal is an operand in an expression, its datatype is
determined by the literal’s value. The datatype of a literal affects
the type promotion of the literal and other operands in an
expression.
|
Literal |
Datatype |
|---|---|
|
Integer literals (no decimal point or exponent) |
Long |
|
Integer literals beyond the range of Long and |
UnsignedLong |
|
Integer literals beyond the range of |
LongLong |
|
Numeric literals with a decimal point (but no |
Decimal |
|
Numeric literals with a decimal point and |
Double |
Out of range
Integer literals beyond the range of LongLong cause compiler
errors.