Which C datatype can represent a 40-bit binary number?

binary, c

Solution

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, and

- `int_fast64_t` - the fastest size in this implementation of at least 64 bits

are 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.

Problem

I need to represent a 40-bit binary number. Which C datatype should be used to handle this?

Original source

Related problems