Question

I want to know what is the reason of the output of the following codes:

unsigned short a=10,aa=-1;
if(a>-1)
  printf("surprise");
else 
  printf(" No surprise");

This gives output "Surprise"

 unsigned int a=10,aa=-1;
    if(a>-1)
      printf("surprise");
    else 
      printf("No surprise");

This gives output "No Surprise"

and

unsigned short a=10,aa=-1;
if(a>aa)
   printf("surprise");
else 
  printf("No surprise");

This gives the output "No Surprise"

Was it helpful?

Solution

See this Stack Exchange question:

In a C expression where unsigned int and signed int are present, which type will be promoted to what type?

In the response from AProgrammer, the complete rules are listed. In your first case, the 4th rule applies (-1 is signed integer, which can represent all the values of unsigned short, therefore the unsigned short is promoted to signed integer). In your second case, the 3rd rule applies (signed integer cannot represent all values of unsigned integer, so it is changed to unsigned integer). In your third case, the -1 is converted to unsigned short and then the first rule applies.

In general I like to avoid confusion by converting all vars to the same signed type (large enough to hold the range I expect) before doing any comparisons.

OTHER TIPS

Its integer promotion specified in C language. Basically, the arithmetic are done in signed rather than short. I assume you use a 32 bit and above CPU.

unsigned short a=10,aa=-1;
if(a>-1)
  printf("surprise");
else 
  printf(" No surprise");

The above translate into assembly below. So, what you get is signed int(10) compare with signed int (-1), as indicated by the assembler using jle instruction.

unsigned short a=10,aa=-1;
000C17DE  mov         eax,0Ah  
000C17E3  mov         word ptr [a],ax  
000C17E7  mov         eax,0FFFFh  
000C17EC  mov         word ptr [aa],ax  
    if(a>-1)
000C17F0  movzx       eax,word ptr [a]  
000C17F4  cmp         eax,0FFFFFFFFh  
000C17F7  jle         wmain+52h (0C1812h)

As for part 2, it unsigned compares 0x0A with 0xFFFFFFFF. For part 3, it signed compares 0x0A with 0xFFFF

You're initializing an unsigned variable to -1. Unsigned variables can only represent non-negative numbers. C does not specify what representation is used for negative signed numbers, so when you assign a negative number of an unsigned variable, you invoke undefined behavior. At that point, the program can print "surprise", "no surprise", or "happy birthday".

On a 2s complement machine (which most modern CPUs are), -1 has the same bit representation as the largest unsigned value, so it's likely that you've initialized aa to the maximum representable value. If that's what you actually intend, you should use aa = USHRT_MAX instead.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top