tags:

views:

313

answers:

4

I was expecting this to print a very large number and that same number -1 but it just prints -1 and -2, why is this?

fprintf(stderr, "%d\n", 0xffffffff);
fprintf(stderr, "%d\n", 0xfffffffe);
+27  A: 

The %d format is a signed integer (decimal). Integers are stored using two's complement, which means that the high-order bit (8000 0000) indicates, in a manner of speaking, the sign of the value.

Counting down from 3, values are:

0000 0003 = 3
0000 0002 = 2
0000 0001 = 1
0000 0000 = 0
FFFF FFFF = -1
FFFF FFFE = -2

etc.

If you want FFFF FFFF to display as a large positive number, use the %u (unsigned) format.

Bob Kaufman
oh, whats the % for long? or unsigned?
%u - just added to the response :)
Bob Kaufman
int is %d, unsigned is %u, long int is %ld, long unsigned is %lu
Graeme Perrow
no, the %d means signed decimal, a %u would be unsigned decimal.
pavium
the % just indicates that "something" is going to get put there. For example %.02f is perfectly legit and will print a floating point with 2 digits after the decimal point and if there are no post decimal point digits will print 2 0s.
Goz
+4  A: 

The values you mention are the two's complement representation of -1 and -2

Look up two's complement

pavium
+3  A: 

The first bit on a signed integer is the sign, so the highest number that could be stored is 0xEFFFFFFF.

Dan Monego
+7  A: 

The argument "%d" prints the input as a signed integer. As a result, you have discovered the two's complement representation, consider "%u" instead.

Barns