Working with C++ Variables and Constants
Programs need a way to store the data they use. Variables and constants offer various ways to represent, store, and manipulate that data.
Today you will learn
How to declare and define variables and constants.
How to assign values to variables and manipulate those values.
How to write the value of a variable to the screen.
What Is a Variable?
In C++ a variable is a place to store information. A variable is a location in your computer's memory in which you can store a value and from which you can later retrieve that value.
Notice that this is temporary storage. When you turn the computer off, these variables are lost. Permanent storage is a different matter. Typically, variables are permanently stored either to a database or to a file on disk. Storing to a file on disk is discussed on Day 16, "Advanced Inheritance."
Data Is Stored in Memory
Your computer's memory can be viewed as a series of cubbyholes. Each cubbyhole is one of many, many such holes all lined up. Each cubbyholeor memory locationis numbered sequentially. These numbers are known as memory addresses. A variable reserves one or more cubbyholes in which you may store a value.
Your variable's name (for example, myVariable) is a label on one of these cubbyholes so that you can find it easily without knowing its actual memory address. Figure 3.1 is a schematic representation of this idea. As you can see from the figure, myVariable starts at memory address 103. Depending on the size of myVariable, it can take up one or more memory addresses.
Figure 3.1 A schematic representation of memory.
NOTE
RAM stands for Random Access Memory. When you run your program, it is loaded into RAM from the disk file. All variables are also created in RAM. When programmers talk about memory, it is usually RAM to which they are referring.
Setting Aside Memory
When you define a variable in C++, you must tell the compiler what kind of variable it is: an integer, a character, and so forth. This information tells the compiler how much room to set aside and what kind of value you want to store in your variable.
Each cubbyhole is one byte large. If the type of variable you create is four bytes in size, it needs four bytes of memory, or four cubbyholes. The type of the variable (for example, integer) tells the compiler how much memory (how many cubbyholes) to set aside for the variable.
There was a time when it was imperative that programmers understood bits and bytes; after all, these are the fundamental units of storage. Computer programs have gotten better at abstracting away these details, but it is still helpful to understand how data is stored. For a quick review of the underlying concepts in binary math, please take a look at Appendix A, "Binary and Hexadecimal."
NOTE
If mathematics makes you want to run from the room screaming, then don't bother with Appendix A; you won't really need it. The truth is that programmers no longer need to be mathematicians; though we do need to be comfortable with logic and rational thinking.
Size of Integers
On any one computer, each variable type takes up a single, unchanging amount of room. That is, an integer might be two bytes on one machine and four on another, but on either computer it is always the same, day in and day out.
A char variable (used to hold characters) is most often one byte long.
NOTE
There is endless debate about how to pronounce char. Some say it as "car," some say it as "char"(coal), others say it as "care." Clearly, car is correct because that is how I say it, but feel free to say it however you like.
A short integer is two bytes on most computers, a long integer is usually four bytes, and an integer (without the keyword short or long) can be two or four bytes. You'd think the language would specify this exactly, but it doesn't. All it says is that a short must be less than or equal to the size of an int, which in turn must be less than or equal to the size of a long.
That said, you're probably working on a computer with a 2-byte short and a 4-byte int, with a 4-byte long.
The size of an integer is determined by the processor (16 bit or 32 bit) and the compiler you use. On modern 32-bit (Pentium) computers using modern compilers (for example, Visual C++ 4 or later), integers are four bytes. This book assumes a 4-byte integer, although your mileage may vary.
A character is a single letter, number, or symbol that takes up one byte of memory.
Compile and run Listing 3.1 on your computer and it will tell you the exact size of each of these types.
Listing 3.1 Determining the Size of Variable Types on Your Computer
0: #include <iostream> 1: 2: int main() 3: { 4: using std::cout; 5: 6: cout << "The size of an int is:\t\t" 7: << sizeof(int) << " bytes.\n"; 8: cout << "The size of a short int is:\t" 9: << sizeof(short) << " bytes.\n"; 10: cout << "The size of a long int is:\t" 11: << sizeof(long) << " bytes.\n"; 12: cout << "The size of a char is:\t\t" 13: << sizeof(char) << " bytes.\n"; 14: cout << "The size of a float is:\t\t" 15: << sizeof(float) << " bytes.\n"; 16: cout << "The size of a double is:\t" 17: << sizeof(double) << " bytes.\n"; 18: cout << "The size of a bool is:\t" 19: << sizeof(bool) << " bytes.\n"; 20: 21: return 0; 22: }
Output
The size of an int is: 4 bytes. The size of a short int is: 2 bytes. The size of a long int is: 4 bytes. The size of a char is: 1 bytes. The size of a float is: 4 bytes. The size of a double is: 8 bytes. The size of a bool is: 1 bytes.
NOTE
On your computer, the number of bytes presented might be different.
Most of Listing 3.1 should be pretty familiar. I've split the lines to make them fit for the book, so for example, lines 6 and 7 could really be on a single line. The compiler ignores white space (spaces, tabs, line returns) and so treats these as a single line.
The one new feature in this program is the use of the sizeof() operator in lines 6-19. sizeof() is provided by your compiler, and it tells you the size of the object you pass in as a parameter. On line 7, for example, the keyword int is passed into sizeof(). Using sizeof(), I was able to determine that on my computer an int is equal to a long int, which is four bytes.
signed and unsigned
All integer types come in two varieties: signed and unsigned. The idea here is that sometimes you need negative numbers and sometimes you don't. Integers (short and long) without the word "unsigned" are assumed to be signed. signed integers are either negative or positive. unsigned integers are always positive.
Because you have the same number of bytes for both signed and unsigned integers, the largest number you can store in an unsigned integer is twice as big as the largest positive number you can store in a signed integer. An unsigned short integer can handle numbers from 0 to 65,535. Half the numbers represented by a signed short are negative, thus a signed short can only represent numbers from -32,768 to 32,767. If this is confusing, be sure to read Appendix A.
Fundamental Variable Types
Several other variable types are built into C++. They can be conveniently divided into integer variables (the type discussed so far), floating-point variables, and character variables.
Floating-point variables have values that can be expressed as fractionsthat is, they are real numbers. Character variables hold a single byte and are used for holding the 256 characters and symbols of the ASCII and extended ASCII character sets.
The ASCII character set is the set of characters standardized for use on computers. ASCII is an acronym for American Standard Code for Information Interchange. Nearly every computer operating system supports ASCII, although many support other international character sets as well.
The types of variables used in C++ programs are described in Table 3.1. This table shows the variable type, how much room this book assumes it takes in memory, and what kinds of values can be stored in these variables. The values that can be stored are determined by the size of the variable types, so check your output from Listing 3.1.
Table 3.1 Variable Types
Type |
Size |
Values |
bool |
1 byte |
true or false |
unsigned short int |
2 bytes |
0 to 65,535 |
short int |
2 bytes |
-32,768 to 32,767 |
unsigned long int |
4 bytes |
0 to 4,294,967,295 |
long int |
4 bytes |
-2,147,483,648 to 2,147,483,647 |
int (16 bit) |
2 bytes |
-32,768 to 32,767 |
int (32 bit) |
4 bytes |
-2,147,483,648 to 2,147,483,647 |
unsigned int (16 bit) |
2 bytes |
0 to 65,535 |
unsigned int (32 bit) |
4 bytes |
0 to 4,294,967,295 |
char |
1 byte |
256 character values |
float |
4 bytes |
1.2e-38 to 3.4e38 |
double |
8 bytes |
2.2e-308 to 1.8e308 |
NOTE
The sizes of variables might be different from those shown in Table 3.1, depending on the compiler and the computer you are using. If your computer had the same output as was presented in Listing 3.1, Table 3.1 should apply to your compiler. If your output from Listing 3.1 was different, you should consult your compiler's manual for the values that your variable types can hold.