## How do unsigned integers differ from signed integers?

Member
Posts: 185
Joined: 2005.02
Post: #1
how do signed/unsigned variables work? I figured it was probably just a bit at the very left that determined the sign, so by that reasoning setting an int to 0x40000000 would set the integer to 2147483648. But it doesn't, 0x40000000 sets the integer to 1073741824. so that means that setting the integer to 0x40000000 is setting it to 00100000000000000000000000000000, instead of 0100000000000000000000000000000. so then setting the int to 0x80000000 would set it to 2147483648. Again, wrong. 0x80000000 sets the integer to -2147483648. So then how would you set the int to (+)2147483648? Also, setting an unsigned int to the same hexadecimal numbers yields the same decimal numbers,including the -2147483648!

Someone, please, Save me from this vortex of big numbers and confusion!

[If you have finished reading this post the first time and 1) understand it and 2) have not developed a headache, then you are a genius]
Moderator
Posts: 1,140
Joined: 2005.07
Post: #2
Signed integers work by using two's complement notation. Basically, to take the negative of a number, you take the number, flip the bits, and add 1. Do the same to reverse the negative. This makes it very easy to do things such as arithmetic with negative numbers, which is one of the reasons why it's used. Here's some information on two's complement numbers.
http://en.wikipedia.org/wiki/Twos_complement

Unsigned works by treating the bit pattern as a positive number, regardless of how large it gets. The reason why it seems to give you the same result is you are probably telling printf (or whatever print function you're using) to print out signed rather than unsigned values. Use %u for printf to explicitly print out the unsigned value.
Luminary
Posts: 5,143
Joined: 2002.04
Post: #3
First, make sure you're printing your unsigned integers as unsigned integers -- C allows implicit conversion between signed and unsigned, which makes negative signed ints into large unsigned ones, and large unsigned ones into negative ints. printf's %d format is for ints, %u is for unsigned ints.

The largest signed int is 0x7fffffff, which is 2147483647.

How negative numbers work: http://en.wikipedia.org/wiki/Two%27s_complement

took so long to type this that I got beaten by akb825...[/edit]
Member
Posts: 185
Joined: 2005.02
Post: #4
Thanks for the replies!