Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How big can a 64 bit unsigned integer be?

Tags:

c

I am quite clear about How big can a 64bit signed integer be? Thanks to this question and its straightforward answers.

So, according to that, could I say that an unsigned int can be 2^64 - 1, rather than 2^63 - 1?

2^63 - 1:    0111111111111111111111111111111111111111111111111111111111111111

2^64 - 1:    1111111111111111111111111111111111111111111111111111111111111111

If and only if I got it correctly, how can I detect an unsigned overflow? An overflow of a signed integer in two's complement representation would invade the highest bit position, returning a negative number. But how about this unsigned case?

like image 792
Worice Avatar asked Sep 27 '17 07:09

Worice


People also ask

What is the largest unsigned integer?

The number 4,294,967,295, equivalent to the hexadecimal value FFFF,FFFF16, is the maximum value for a 32-bit unsigned integer in computing.

How big is an unsigned long int?

Description. Unsigned long variables are extended size variables for number storage, and store 32 bits (4 bytes). Unlike standard longs unsigned longs won't store negative numbers, making their range from 0 to 4,294,967,295 (2^32 - 1).


2 Answers

Signed integer can only go as far as 2^63-1 (9,223,372,036,854,775,807) because the bit of highest significance is reserved for the sign. If this bit is 1 then the number is negative, and can go as low as -2^63 (-9,223,372,036,854,775,808).

On a signed 64-bit integer, 2^64-1 is actually the number -1.

If you use unsigned integers however, the value starts at 0 and 2^64-1 (18,446,744,073,709,551,615) becomes it's highest value, but unsigned integers cannot represent negative values.

like image 50
Havenard Avatar answered Sep 22 '22 13:09

Havenard


It is hard or impossible to detect by looking at a value.
The problem is the maximum value plus even only 1 is still/again a valid value; i.e. 0.

This is why most programmers avoid as much as possible, if it is actually a wrong value. For some applications, wrapping around is part of the logic and fine.

If you calculate e.g. c=a+b; (a, b, c being 64bit unsigned ints and a,b being worryingly close to max, or migth be) and want to find out whether the result is affected,
then check whether ((max - b) < a); with max being the appropriate compiler-provided symbol.

Do not calculate the maximum value yourself as 2^64-1, it will be implementation specific and platform specific. On top of that, it will contain the wraparound twice (2^64 being beyond max, probably 0; and subtracting 1 going via 0 back...). And that applies even if ^ is understood to be an appropriate version of "to the power of".

like image 37
Yunnosch Avatar answered Sep 22 '22 13:09

Yunnosch