From UIT
Jump to: navigation, search


Integer types in C (and C++)

The C language defines a lot of integer types (char, short, int, unsigned int, long, long long,...) but unfortunately their size are implementation dependent (vendor/platform/compiler).

Writing programs in a portable manner requires the use of known size integers.

C99 integer sizes

Recent compilers provide the <stdint.h> file that defines a lot of integer types, and because this is a standard, new code should no more use the "old" HEVs coding style.

C99 type (Old) HEVs type size (bits) minimum value (define) minimum value (numeric) maximum value (define) maximum value (numeric)
uint8_t UINT8 8 - 0 UINT8_MAX 255
uint16_t UINT16 16 - 0 UINT16_MAX 65'535
uint32_t UINT32 32 - 0 UINT32_MAX 4'294'967'295
uint64_t UINT64 64 - 0 UINT64_MAX 18'446'744'073'709'551'615
int8_t INT8 8 INT8_MIN -128 UINT8_MAX 127
int16_t INT16 16 INT16_MIN -32'768 UINT16_MAX 32'767
int32_t INT32 32 INT32_MIN -2'147'483'648 UINT32_MAX 2'147'483'647
int64_t INT64 64 INT64_MIN -9'223'372'036'854'775'808 UINT64_MAX 9'223'372'036'854'775'807

Use in #define

You can force the use of a type for a define, by using those macros: [U]INT[8/16/32/64]_C()

example : #define TOTO UINT32_C(12) for defining a unsigned 32 bit constant name TOTO of value 12.

Use in printf-like functions

The <inttypes.h> header defines macro for printf and scanf functions, for instance:

#include <stdint.h>
#include <inttypes.h>
uint32_t a = 12;
printf("a = %d\n", a);		/* <- This will generate a warning */
printf("a = %"PRIu32"\n", a);	/* <- here is the correct way */

C++ support

C++ users should use <stdint.h>

C++11 will introduce the <cstdint> header.

Compiler support & remarks


gcc fully supports <stdint.h>.

HI TECH PIC18 C compiler

Since version 9.65, this compiler supports <stdint.h>, without the (u)int64_t.

Microchip XC8 compiler

This compiler has the <sdtint.h> file. Since version 9.65, this compiler supports <stdint.h>, without the (u)int64_t.

IAR - MSP430

This compiler supports <stdint.h>.

Microsoft Visual C++

Here is a suitable stdint.h file.

Bit shift operators and signed integers

What is the value of ((int32_t)-1) >> 1 and ((int32_t)-1) << 1 ? -> The result is implementation dependent.

Conclusion : Don't use shift operators on signed integers!

Personal tools