Zilog Z8F0130 User Manual
Page 114
Using the Integrated Development Environment
UM013037-1212
90
Zilog Developer Studio II – Z8 Encore!
User Manual
in effect or not. In this sense, the ANSI promotions make the handling of char types incon-
sistent compared to the treatment of other integer types.
It is better coding practice to show such promotions explicitly, as in the following exam-
ple:
int i = (int) a + (int) b;
Then, you get the same answer whether promotions are enabled or disabled. If instead,
you write:
char c = a + b;
then even with ANSI promotions enabled, you do not get the right answer. You did not
anticipate that the arithmetic operation can overflow an 8-bit value. With ANSI promo-
tions disabled, the value of the expression (136) is truncated to fit into the 8-bit result,
again yielding the value (char)
-
120. With ANSI promotions enabled, the expression eval-
uates directly to (char)
-
120.
There are two more types of code constructs that behave differently from the ANSI Stan-
dard when the ANSI promotions are disabled. These occur when an expression involving
unsigned chars is then assigned to a signed int result and when relational operators are
used to compare an unsigned char to a signed char. Both of these are generally poor pro-
gramming practice due to the likelihood of operand signs not being handled consistently.
The following code illustrates the cases in which the code behaves differently depending
on the setting of the
Disable ANSI Promotions
checkbox. When ANSI promotions are
on, the code prints:
START
EQUAL
SIGNED
DONE
When ANSI promotions are off, the code prints:
START
NOT EQUAL
UNSIGNED
DONE
In every case, the difference occurs because when promotions are on, the unsigned chars
are first promoted to signed ints, then the operation occurs; with promotions off, the oper-
ations occur first, then the promotion happens afterward. In every case except the second
test, the code with promotions off has to invoke the ANSI Standard’s rules for how to con-
vert a negative result into an unsigned type – another indication that it is generally poorly
written code for which this setting makes a difference in program behavior.
#include
unsigned char uch1 = 1;
unsigned char uch2 = 2;
- Z8F0131 Z8F0230 Z8F0231 Z8F0430 Z8F0431 Z8F043A Z8F0830 Z8F0831 Z8F083A Z8F1232 Z8F1233 Z8F0113 Z8F011A Z8F0123 Z8F012A Z8F0213 Z8F021A Z8F0223 Z8F022A Z8F0411 Z8F0412 Z8F0413 Z8F041A Z8F0421 Z8F0422 Z8F0423 Z8F042A Z8F0811 Z8F0812 Z8F0813 Z8F081A Z8F0821 Z8F0822 Z8F0823 Z8F082A Z8F0880 Z8F1621 Z8F1622 Z8F1680 Z8F1681 Z8F1682 Z8F2421 Z8F2422 Z8F2480 Z8F3221 Z8F3222 Z8F3281 Z8F3282 Z8F4821 Z8F4822 Z8F4823 Z8F6081 Z8F6082 Z8F6421 Z8F6422 Z8F6423 Z8F6481 Z8F6482 Z8FS021A ZMOT1AHH Z8FS040B ZMOT0BHH ZMOT0BSB Z8FMC04 Z8FMC08 Z8FMC16