INFO: Signed Converted to Unsigned in Comparison with Unsigned

Last reviewed: September 4, 1997
Article ID: Q68265

The information in this article applies to:
  • Microsoft C compiler for MS-DOS, versions 6.0, 6.0a, 6.0ax
  • Microsoft C compiler for OS/2, versions 6.0, 6.0a
  • Microsoft C/C++ compiler for MS-DOS, version 7.0
  • Microsoft C/C++ compiler for OS/2, version 7.0
  • Microsoft Visual C++ for Windows, versions 1.0, 1.5
  • Microsoft Visual C++ 32-bit Edition, versions 1.0, 2.0, 4.0, 5.0

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 the Microsoft C "Advanced Programming Techniques" version 6.0 manual 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

   /* Compile options needed: none
   */

   #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 query words: 8.00 8.00c 9.00
Keywords : CLngIss kbcode kbfasttip
Version : MS-DOS:6.0,6.00a,6.00ax,7.0; OS/2:6.0,6.00a,7.0; WINDOWS:1.0,1.5; WINDOWS NT:1.0,2.0,4.0,5.0
Platform : MS-DOS NT OS/2 WINDOWS
Issue type : kbinfo


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: September 4, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.