INFO: Unsigned Characters and Arithmetic Operators (45237)
The information in this article applies to:
- Microsoft C for MS-DOS
- Microsoft Visual C++ 1.0
- Microsoft Visual C++ 1.5
- Microsoft Visual C++ 1.51
- Microsoft Visual C++ 1.52
- Microsoft Visual C++ 2.0
- Microsoft Visual C++ 2.1
- Microsoft Visual C++ 4.0
- Microsoft Visual C++, 32-bit Enterprise Edition 5.0
- Microsoft Visual C++, 32-bit Enterprise Edition 6.0
- Microsoft Visual C++, 32-bit Professional Edition 5.0
- Microsoft Visual C++, 32-bit Professional Edition 6.0
- Microsoft Visual C++, 32-bit Learning Edition 6.0
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
*/
#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");
Modification Type: | Minor | Last Reviewed: | 7/5/2005 |
---|
Keywords: | kbcode kbinfo kbLangC KB45237 |
---|
|