1: //number_conversion.cpp 2: //Illustrates the conversion of some values from one 3: //numerical data type to another, by coercion and by casting. 5: #include <iostream> 6: using namespace std; 8: int main() 9: { 10: cout << "\nThis program shows instances in which a value of one " 11: "data type is converted to\na value of another data type. " 12: "Study both source code and output very carefully.\n\n"; 13: int i; 14: double r; 16: //Type coercion (implicit type conversion) in assignment statements: 17: i = 3.24; cout << i << endl; //Each of these two lines may generate 18: i = 3.97; cout << i << endl; //a conversion warning. Why? 19: r = 5; cout << r << endl << endl; 20: //What style rule have we violated here (for the sake of readability)? 22: //Type coercion in arithmetic expressions: 23: cout << 2 * 3.51 + 4 / 1.2 << endl << endl; 25: //Type casting (explicit type conversion) in assignment statements: 26: i = static_cast<int>(3.24); cout << i << endl; 27: i = static_cast<int>(3.97); cout << i << endl; 28: r = static_cast<double>(5); cout << r << endl << endl; 31: //Type casting is sometimes necessary in arithmetic expressions 32: //to obtain a correct answer, as is illustrated by: 33: int numberOfHits = 68; 34: int numberOfAtBats = 172; 35: double battingAverage; 37: battingAverage = 68 / 172; 38: cout << battingAverage << endl; //Gives the wrong value. Why? 40: battingAverage = static_cast<double>(numberOfHits / numberOfAtBats); 41: cout << battingAverage << endl; //Still wrong. Why? 43: battingAverage = static_cast<double>(numberOfHits) / numberOfAtBats; 44: cout << battingAverage << endl; //OK, but ... 45: battingAverage = static_cast<double>(numberOfHits) / 46: static_cast<double>(numberOfAtBats); 47: cout << battingAverage << endl; //... even better (more specific) 48: cout << endl; 51: //Type casting is also useful for rounding numbers: 52: cout << static_cast<int>(4.37 + 0.5) << endl; 53: cout << static_cast<int>(4.61 + 0.5) << endl; 54: cout << static_cast<int>(4.37 * 10 + 0.5) / 10.0 << endl; 55: cout << static_cast<int>(4.61 * 10 + 0.5) / 10.0 << endl << endl; 56: }