C PROGRAMMING
Data Types
Date Published: | |
Last Modified: |
The Basic Data Types
char | The smallest type on an architecture. Usually 8-bits wide. Sign depends on implementation. |
int | The only type that the modulus operation can be applied on. At least 16-bits in size. Usually 32-bits on 32-bit systems. |
float | Single precision floating point number. Typically 32-bits wide. |
double | Double precision floating point number. Typically 64-bits wide, although can be analogous to float (i.e. 32-bits wide) on smaller systems such as 8-bit microcontrollers. |
long double | Not normally supported on embedded platforms. 128-bits. |
void | Special case data-type. |
Using sizeof()
sizeof()
can be used to return the number of bytes each type uses.
“There was a young man named Wight, Who invented the thirteen bit byte. You’ll get so much more, from your memory, I’m sure. But sadly your sizeof ain’t right.”
Fixed-width Integral Types
The problem with using int
and all of it’s derivatives (short int
, long int
, long long int
, e.t.c) is that the width of the integer is platform specific. It is normally the same width as the platforms bus, but at least 16-bits. It is also called the natural width. For example, on an 8-bit system, an int
will be 16 bits wide (remember, the C standard specifies it can’t be less than 16 bits). On a 16-bit platform, it will usually be 16 bits, 32 bits for a 32-bit platform, 64 bits for a 64-bit platform, and so on, you get the idea!
To write portable code, it is usually better to use fixed-width integral types.
Fixed-width integral types also need special symbols for printf()
statements. These are specified in <cinttypes.h>
. They begin with the letters PRI
.
Floating Point Support
Most higher-end microcontrollers and CPUs will have a hardware floating-point unit (FPU) inside them, which allows the CPU to do fast floating-point arithmetic. If you have a lower-end, cheaper microcontroller, it may not contain a FPU. In this case, you really have two options if you want to manipulate numbers with decimal precision:
- Use a software-based floating point library (it does the floating-point arithmetic using the CPU). This is usually much lower than when there is a FPU. Berkeley Softfloat is one of the most powerful, widely available software-based floating-point libraries.
- Use fixed-point numbers instead! See /programming/general/fixed-point-mathematics for more info, or check out my C++ fixed-point library for embedded systems at https://github.com/gbmhunter/MFixedPoint/.
