### Question 1.1

How do you decide which integer type to use?

If you might need large values (above 32,767 or below -32,767), use `long`. Otherwise, if space is very important (i.e. if there are large arrays or many structures), use `short`. Otherwise, use `int`. If well-defined overflow characteristics are important and negative values are not, or if you want to steer clear of sign-extension problems when manipulating bits or bytes, use one of the corresponding `unsigned` types. (Beware when mixing signed and unsigned values in expressions, though.)

Although character types (especially `unsigned char`) can be used as ``tiny'' integers, doing so is sometimes more trouble than it's worth, due to unpredictable sign extension and increased code size. (Using `unsigned char` can help; see question 12.1 for a related problem.)

A similar space/time tradeoff applies when deciding between `float` and `double`. None of the above rules apply if the address of a variable is taken and must have a particular type.

If for some reason you need to declare something with an exact size (usually the only good reason for doing so is when attempting to conform to some externally-imposed storage layout, but see question 20.5), be sure to encapsulate the choice behind an appropriate typedef.

References: K&R1 Sec. 2.2 p. 34
K&R2 Sec. 2.2 p. 36, Sec. A4.2 pp. 195-6, Sec. B11 p. 257
ANSI Sec. 2.2.4.2.1, Sec. 3.1.2.5
ISO Sec. 5.2.4.2.1, Sec. 6.1.2.5
H&S Secs. 5.1,5.2 pp. 110-114

Read sequentially: next up top

This page by Steve Summit // Copyright 1995 // mail feedback