Microsoft KB Archive/45237

= INFO: Unsigned Characters and Arithmetic Operators =

Article ID: 45237

Article Last Modified on 7/5/2005

-

APPLIES TO


 * Microsoft C Professional Development System 6.0a
 * Microsoft Visual C++ 1.0 Professional Edition
 * Microsoft Visual C++ 1.5 Professional Edition
 * Microsoft Visual C++ 1.51
 * Microsoft Visual C++ 1.52 Professional Edition
 * Microsoft Visual C++ 2.0 Professional Edition
 * Microsoft Visual C++ 2.1
 * Microsoft Visual C++ 4.0 Standard Edition
 * Microsoft Visual C++ 5.0 Enterprise Edition
 * Microsoft Visual C++ 6.0 Enterprise Edition
 * Microsoft Visual C++ 5.0 Professional Edition
 * Microsoft Visual C++ 6.0 Professional Edition
 * Microsoft Visual C++ 6.0 Standard Edition

-



This article was previously published under Q45237





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


 * 1) include 

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

if (x != (~y)) printf (&quot;y is not a complement of x\n&quot;); else printf (&quot;y is a complement of x\n&quot;); } 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 &quot;~y&quot; as unsigned character, as follows: if (x != (unsigned char)(~y)) printf (&quot;y is not a complement of x\n&quot;); else printf (&quot;y is a complement of x\n&quot;);

Keywords: kbinfo kblangc kbcode KB45237

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.