C++ Data Type Sizes

CPP

Size matters! So let’s learn about the actual sizes of C++ data types. A Bit is the smallest unit of storage. It’s 0 or 1, on or off.

A Byte is 8 bits. I wish the world used the French version of the word which is Octet. The combination of on/off in 8 bits can give us our data values!

A char takes up just 1 byte. Below represents 8 bits with different on/off values which represent a char that represents 1. Note that it’s not a value of 1 but a character that reads as 1.

Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1
0 0 1 1 0 0 0 1

If you use std::bitset, you can see this representation with bitset<CHAR_BIT>('a').

A short takes up 2 bytes or 16 bits. The numeric range of a short would be from 0 to 216 or 65536. This is assuming it’s unsigned. If we want to support negative values, the range shifts (imagine the number line shifting by half) to -32768 to -32767.

An int takes up (assuming you’re on a 32-bit system) 4 bytes or 32 bits and can store considerably bigger values. You’re looking at 232 which is 4294967296.
Note: you can always use sizeof() to verify the number of bytes your type takes which is subject to your computer architecture.

A double is even greater at 8 bytes or 64 bits. At approximately 1.8 * 1019, you’re dealing with massive numerical capacity (and memory implications too). Needless to say, don’t use a double when an int would suffice.

A float takes up 4 bytes much like an int. This might seem odd because floats seem to be capable of holding much larger values. This is because a float is encoded to represent exponentials. The IEEE 754 standard dictates that 1 bit determines the sign, 23 bits determine the fraction and 8 bits determine the exponential. The value below represents PI.

Sign (1) Exponent (28 but -126 to 127) Fraction (224)
0 10000000 10010010000111111011011

So we’re still employing 32 bits but we can express larger numbers with exponents. The cost of this wider range is accuracy.

A bool is one byte. However, this too seems odd at first. A bool is much like a bit - on or off, 0 or 1, false or true. Why do we need a whole byte to express a bool? That’s because the CPU addresses memory in bytes not bits. However with bit fields, we can force members of classes or structures to use less space.