Short int values above 32767

c, short

Solution

Integer values are stored using Twos Complement. In twos complement, the range of possible values is `-2^n` to `2^n-1`, where n is the number of bits used for storage. Because of the way the storage is done, when you go above `2^n-1`, you end up wrapping around back to `2^n`.

Shorts use 16 bits (15 bits for numeric storage, with the final bit being the sign).

EDIT: Keep in mind that this behavior is NOT guaranteed to occur. Programming languages may act completely differently. Technically, going above or below the max/min value is undefined behavior and it should be treated as such. (Thanks to Eric Postpischil for keeping me on my toes)

Problem

When trying to store short integer values above 32,767 in C, just to see what happens, I notice the result that gets printed to the screen is the number I am trying to store, - 65,536. E.g. if i try to store 65,536 in a short variable, the number which is printed to the screen is 0. If I try to store 32,768 I get -32,768 printed to the screen. And if I try to store 65,546 and print it to the screen I get 10. I think you get the picture. Why am I seeing these results?

Original source