I need to represent a 40-bit binary number. Which C datatype should be used to handle this?
If you're using a C99 or C11 compliant compiler, then use int_least64_t
for maximum compatibility. Or, if you want an unsigned type, uint_least64_t
. These are both defined in <stdint.h>
<stdint.h>
usually also defines int64_t
, but since it's not required by the standard, it may not be defined in every implementation. However:
int_least64_t
- at least 64 bits, andint_fast64_t
- the fastest size in this implementation of at least 64 bitsare both required to be present in C99 and C11 (See § 7.18.1.2-3 in the C99 standard, and § 7.20.1.2-3 in the C11 standard).
Although C99 specifies that long long
is at least 64 bits on a particular machine (§ 5.2.4.2.1), the types in <stdint.h> are designed to be explicitly portable.
You can read more about integer sizes on different platforms here.
Note that the size of integer types are a problem with the long
data type - on 64 bit Windows, it's currently 32 bits, whereas on 64 bit linux it's 64 bits. For this reason, I believe you're safest using the types from <stdint.h>
It's worth noting that some feel that long long
is more readable. Personally, I prefer the types from <stdint.h>
, because they allow you to say what you mean when you use them - which I find more readable. Of course, readability is often a matter of taste - and if you're working with an existing codebase, I'd just follow whatever they do :)
If your compiler only supports C89, then R..'s solution will allow you up to 53 bits of integer precision.
The existing answers are good, but if you want C89 support too, double
will be able to store 40-bit integers exactly on all IEEE 754 conformant implementations.
You can use long long
, which can contain 64 bits or more. For more information, see
http://en.cppreference.com/w/cpp/language/types
http://en.wikipedia.org/wiki/Integer_(computer_science)#Common_long_integer_sizes
Define the 64 bit width integer in Linux
long long
is an integer type with at least 64 bits. It will fit signed 40 bit values on all platforms. You can also use unsigned long long
for unsigned values of 64 bits or more.