1
#include<stdio.h>
int main()
{

  char c =118,a=117;
  c=c+10;
  a=a+10;
  printf("c:%d, a:%d\n", c,a);

}

The answer is c:-128, a:127.

Can someone explain me why c+10 is -128 and a+10 is 127?

Thanks in advance.

deepak
  • 253
  • 1
  • 4
  • 10

4 Answers4

3

117 + 10 = 127 which is in range of the char type (-128 to 127)

If you open the calculator of your windows in programmer mode, you can see that 118 is represented as 1110110 in binary. also, 10 is represented as 1010. if we add this two, the result is ‭10000000‬. it is not in the range of the char type, and this number is equivalent to -128. so the -128 is printed.

Fatemeh Karimi
  • 914
  • 2
  • 16
  • 23
2

because char is 8-bit signed in your compiler. So 118+10 is out of range (max is 127).

The implementation of your compiler "wraps" it around and you get -128 instead.

Jean-François Fabre
  • 137,073
  • 23
  • 153
  • 219
2

Signed 8-bit values range from -128 to 127. The bits for 127 are 0111 1111, and the bits for 128 would be 1000 0000. The problem is, in a signed number, the high order (leftmost) bit is the sign flag (0 is +, 1 is -). So, because it is signed, the computer interprets this as a negative number with the result -128 (This is called signed overflow, if I remember correctly, and everyone runs into this when programming at one point or another) (check out 2's complement to see why the low 7 bits are 128, not 0). You can get around this "problem" by declaring c and a as unsigned char instead of char.

BTW, you could save a variable this way:

char a=117; printf("c:%d, a:%d\n", a+11,a+10);

andrew
  • 71
  • 1
1

In your case, a char is being represented by the compiler on your particular platform as a signed 8-bit value, and is in 2's complement reoresentation. That means the highest bit is the sign bit (if it's a 1, then the number is negative). So the range in binary for non-negative values is (in binary) 00000000-01111111 which is 0-127 in decimal. The negative values range (in binary) from 10000000 to 11111111 which is -128 to -1 in decimal.

If you start with 118, in binary that's:

01110110

If I add decimal 10, that's adding 1010 in binary:

 01110110
+00001010
---------
 10000000

You can see now the highest bit is set, meaning the number overflowed (became greater than the maximum 127 in decimal) and now represents a negative number. The 8-bit binary value 10000000 happens to represent -128 in decimal.

So adding (in decimal) 10 to the char value 118, yields -128.

Your value of a is 117, so 10+117 = 127 still fits in the 7 bits for a positive value of 127. You can do the above binary analysis as an exercise to see how that works.

lurker
  • 56,987
  • 9
  • 69
  • 103
  • That is not relevant for UB. Problem is, it is not UB, but implementation defined, I was wrong - unless `char` has as many bits as `int` - unlikely. It has to be specified in the compiler's docs. – too honest for this site Mar 16 '17 at 17:18
  • @Olaf yes I agree. I updated my answer to be a little more clear about platform and compiler dependence. – lurker Mar 16 '17 at 17:21