INFO: Unsigned Characters and Arithmetic Operators

ID: Q45237


The information in this article applies to:
  • Microsoft C for MS-DOS, versions 6.0, 6.0a, 6.0ax
  • Microsoft C/C++ for MS-DOS, version 7.0
  • Microsoft Visual C++ for Windows, 16-bit edition, versions 1.0, 1.5, 1.51, 1.52
  • Microsoft Visual C++, 32-bit Editions, versions 1.0, 2.0, 2.1, 4.0, 5.0, 6.0


SUMMARY

In the sample program below, two unsigned character variables are compared. The conditional always evaluates to true, even when x and y are complements. When examining the assembly code produced, it appears as though the compiler is generating code to compare two unsigned integers, not unsigned characters.

Sample Code


/* Compile options needed: none
*/ 

#include <stdio.h>

void main (void)
{
   unsigned char x, y;
   x = 0;
   y = 255;

   if (x != (~y))
       printf ("y is not a complement of x\n");
   else
       printf ("y is a complement of x\n");
} 
The code generated in this case is correct. Operands of unsigned character type are promoted to unsigned integer type when using arithmetic operators.

For this sample code to work as intended, cast the "~y" as unsigned character, as follows:

if (x != (unsigned char)(~y))
    printf ("y is not a complement of x\n");
else
    printf ("y is a complement of x\n"); 

Additional query words:

Keywords : kbcode kbLangC kbVC kbVC100 kbVC150 kbVC151 kbVC152 kbVC200 kbVC210 kbVC400 kbVC500 kbVC600
Version : MS-DOS:6.0,6.00a,6.00ax,7.0; WINDOWS:1.0,1.5,1.51,1.52; WINDOWS NT:1.0,2.0,2.1,4.0,5.0
Platform : MS-DOS NT WINDOWS
Issue type : kbinfo


Last Reviewed: July 1, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.