beautypg.com

Zilog EZ80F916 User Manual

Page 92

background image

UM014423-0607

Using the Integrated Development Environment

ZiLOG Developer Studio II

eZ80Acclaim!

®

User Manual

72

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. In this case, disabling ANSI promotions gives you the same

wrong answer more efficiently!

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 where the code behaves differently depending on
the setting of the Disable ANSI Promotions check box. When ANSI promotions are on,
the code prints the following:

START

EQUAL

EQUAL

EQUAL

SIGNED

DONE

When ANSI promotions are off, the code prints the following:

START

NOT EQUAL

NOT EQUAL

NOT EQUAL

UNSIGNED

DONE

In every case, the difference occurs because when promotions are on, the unsigned chars
are first promoted to signed ints, and then the operation occurs; with promotions off, the
operations occur first, and 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 convert 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;

unsigned char uch3 = 128;

int int1;

This manual is related to the following products: