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