HP 3000 Manuals

Integral Promotions [ HP C/iX Reference Manual ] MPE/iX 5.0 Documentation


HP C/iX Reference Manual

Integral Promotions 

Wherever an int or an unsigned int can be used in an expression, a
narrower integral type can also be used.  The narrow type will generally
be widened by means of a conversion called an integral promotion.  All
ANSI C compilers follow what are called value preserving rules for the
conversion.  In HP C the value preserving integral promotion takes place
as follows:  a char, a short int, a bit-field, or their signed or
unsigned varieties, are widened to an int; all other arithmetic types are
unchanged by the integral promotion.


NOTE Many older compilers, including previous releases of HP C, performed integral promotions in a slightly different way, following unsigned preserving rules. In order to avoid "breaking" programs that may rely on this non-ANSI behavior, non-ANSI mode continues to follow the unsigned preserving rules. Under these rules, the only difference is that unsigned char and unsigned short are promoted to unsigned int, rather than int. In the vast majority of cases, results are the same. However, if the promoted result is used in a context where its sign is significant (such as a division or comparison operation), results can be different between ANSI mode and non-ANSI mode. The following program shows two expressions that are evaluated differently in the two modes. #include <stdio.h> main () { unsigned short us = 1; printf ("Quotient = %d\n",-us/2); printf ("Comparison = %d\n",us<-1); } To avoid situations where unsigned preserving and value preserving promotion rules yield different results, you could refrain from using an unsigned char or unsigned short in an expression that is used as an operand of one of the following operators: >>, /, %, <, <=, >, or >=. Or remove the ambiguity by using an explicit cast to specify the conversion you want. If you enable ANSI migration warnings, the compiler will warn you of situations where differences in the promotion rules might cause different results. In non-ANSI mode, as with many pre-ANSI compilers, the results will be: Quotient = 2147483647 Comparison = 1 ANSI C gives the following results: Quotient = 0 Comparison = 0


MPE/iX 5.0 Documentation