INF: Signed Converted to unsigned in Comparison with unsigned

ID Number: Q68265

6.00 6.00a 6.00ax 7.00 | 6.00 6.00a

MS-DOS | OS/2

Summary:

The additional adherence to the ANSI standard, beginning with C

version 6.0 and QuickC versions 2.5 and 2.51, will cause a negative

signed integer to be converted to an unsigned integer in a comparison

with an unsigned integer. This is the correct and intended behavior,

although it may produce results that are unexpected. The sample code

below demonstrates this behavior.

More Information:

This is new in C 6.0 and is documented in "Microsoft C Advanced

Programming Techniques" on page 422, Section B.1.2. The following

program produces warning C4018 "signed/unsigned mismatch" at warning

level 3 or 4. Casting of the variables preserves their relationship in

the expression.

Sample Code

-----------

#include <stdio.h>

void main( void)

{

int a = -1;

unsigned b = 1;

if ( b < a )

printf( "Signed was converted to unsigned\n");

else

printf( "Sign was preserved\n");

}

The output from the program above is:

Signed was converted to unsigned

Either of the following methods may be used to achieve the expected

behavior:

- If you are sure that b is less than 32768, change the if statement

to:

if ( (signed int) b < a)

Note: This will produce the most efficient code.

-or-

- Change the if statement to:

if ( (long) b < (long) a)

Additional reference words: 6.00 6.00a 6.00ax 7.00