Simple Character Interpretation In C

后端 未结 9 907
暖寄归人
暖寄归人 2021-01-06 12:54

Here is my code

 #include

 void main()
 {
     char ch = 129;
     printf(\"%d\", ch);
 }

I get the output as -127. What d

9条回答
  •  无人及你
    2021-01-06 13:16

    It means that char is an 8-bit variable that can only hold 2^8 = 256 values, since the declaration is char ch, ch is a signed variable, which means it can store 127 negative and positive values. when you ask to go over 127 then the value starts over from -128.

    Think of it like some arcade games where you go from one side of the screen to the other:

    ch = 50;

                                        ----->                        50 is stored
          |___________________________________|___________|           since it fits
        -128                       0         50          127          between -127
                                                                      and 128
    

    ch = 129;

                                                        ---           129 goes over
          -->                                                         127 by 2, so
          |__|____________________________________________|           it 'lands' in
        -128  -127                 0                     127          -127
    

    BUT!! you shouldn't rely on this since it's undefined behaviour!


    In honor of Luchian Grigore here's the bit representation of what's happening:

    A char is a variable that will hold 8-bits or a byte. So we have 8 0's and 1's struggling to represent whatever value you desire. If the char is a signed variable it will represent whether it's a positive or negative number. You probably read about the one bit representing the sign, that's an abstraction of the true process; in fact it is only one of the first solutions implemented in electronics. But such a trivial method had a problem, you would have 2 ways of representing 0 (+0 and -0):

    0 0000000     ->    +0        1 0000000     ->    -0                    
    ^                             ^ 
    |_ sign bit 0: positive       |_ sign bit 1: negative
    

    Inconsistencies guaranteed!! So, some very smart folks came up with a system called Ones' Complement which would represent a negative number as the negation (NOT operation) of its positive counterpart:

    01010101      ->    +85
    10101010      ->    -85
    

    This system... had the same problem. 0 could be represented as 00000000 (+0) and 11111111 (-0). Then came some smarter folks who created Two's Complement, which would hold the negation part of the earlier method and then add 1, therefore removing that pesky -0 and giving us a shiny new number to our range: -128!. So how does our range look now?

    00000000     +0
    00000001     +1
    00000010     +2
    ...
    01111110     +126
    01111111     +127
    10000000     -128
    10000001     -127
    10000010     -126
    ...
    11111110     -2
    11111111     -1
    

    So, this should give an idea of what's happening when our little processor tries to add numbers to our variable:

     0110010     50                   01111111     127
    +0000010    + 2                  +00000010    +  2
     -------     --                   --------     ---
     0110100     52                   10000001    -127
         ^                                  ^       ^
         |_ 1 + 1 = 10          129 in bin _|       |_ wait, what?!
    

    Yep, if you review the range table above you can see that up to 127 (01111111) the binary was fine and dandy, nothing weird happening, but after the 8'th bit is set at -128 (10000000) the number interpreted no longer held to its binary magnitude but to the Two's Complement representation. This means, the binary representation, the bits in your variable, the 1's and 0's, the heart of our beloved char, does hold a 129... its there, look at it! But the evil processor reads that as measly -127 cause the variable HAD to be signed undermining all its positive potential for a smelly shift through the real number line in the Euclidean space of dimension one.

提交回复
热议问题