problem that we encountered when adding 2 billion and 2 billion。 …………………………………………………………Page 63…………………………………………………………… CH A PT E R 2 ■ L E A R N I N G A B OU T 。 N E T N U M B E R AN D V A L U E T Y P E S 41 Figure 2…13。 How a puter counts to 7 The bad part of an odometer is that you don’t know when the odometer has been wrapped around。 You could end up with a car whose odometer read 100;000 miles/kilometers; but actu ally had driven 1。1 million。 Fortunately; knows when the number type has been wrapped around。 The technical jargon for this situation is overflow or underflow。 Overflow is when the odometer wraps over in the positive direction (900;000 to 1。1 million); and underflow is when the odometer wraps around in the negative direction (0 to –100;000)。 Detection of either situa tion is activated as a project property。 Follow these steps to deactivate overflow/underflow detection for the Calculator class library: 1。 Right…click the Calculator project in the Calculator solution and select Properties。 2。 Click pile; and then click Advanced pile Options。 3。 Check “Remove integer overflow tests” to remove the test for overflow situations。 4。 Click OK to finish。 Rerun the test console application; and you will get an exception indicating that an over flow has occurred。 Error found(…294967296) should have been (4000000000) Having an overflow situation is a problem; and the fact that can catch it is a good thing。 But at the end of the day; our preferred solution is to be able to add 2 billion plus 2 billion。 After all; Bill Gates would probably prefer having 4 billion in his bank account instead of the calculated minus value or an error indicating that the bank cannot accept his 4 billion。 …………………………………………………………Page 64…………………………………………………………… 42 CH AP T E R 2 ■ L E A R N IN G AB OU T 。 N E T N U M B E R A N D V A L U E T Y P E S Understanding Numeric and Value Data Types A data type is a way of describing a piece of data using a metadescription。 For example; if you have a Double type; you know you will have a double number。 Many data types are available: Integer; Long; Short; Single; Double; String; Enum; Structure; and so on。 You can even define your own data types。 Data types are the heart of the CLR and a type…safe programming environment。 Understanding Value and Reference Types The CLR supports two ways of representing data: value and reference。 The major difference between a value and reference type is how the information associated with the type is stored。 The problem with value and reference types is that they are a technical invention and can be confusing。 When the CLR runs an application; a thread is executing the mon Language Infra structure (CLI)。 Think of a thread as you wandering around a mall buying things。 You are an individual and can buy things independently of other people。 The store will have many people looking around and buying different things。 Likewise; a puter has many threads doing many different independent things。 When you look around in a store; you might bump into people and cause them to drop things。 While the CLR tries to avoid such problems; if you try hard enough in your code; you can cause other threads to “drop” things。 When it executes; a thread has a local memory pool called a stack; which is akin to you carrying a wallet that contains cash and credit cards。 You carry the wallet with you from store to store; like a thread carries a stack when calling one method to another。 When you enter the store and want to purchase something; you have two major ways of paying for the item: with cash or by using a credit/debit card。 However; with a credit/debit card; you can’t pay immedi ately。 You need a machine that calls a server to verify that your piece of plastic has enough money to pay for the item。 Paying with cash is much faster than paying with a credit card; because you don’t need to talk to a remote puter。 Now suppose you and your spouse want to pay for the item。 You could use the same credit card account; but you have unique credit cards。 But you cannot do the same thing with cash。 If you have a 10 bill; your spouse cannot share the 10 with you。 Your spouse would need a second 10 bill; and together you would have 20。 The cash and credit card payment methods are analogous to value and reference types。 Cash is a value type; and the credit card is a reference type。 When the CLR executes; the code dragged from one method call to another method call is the stack that contains a number of value type variables。 Value types are stored directly on the stack like cash。 Reference types are stored as pointers to memory on the stack; just like a credit/debit card points to cash some where else。 The reference pointer points to a piece of memory called the heap。 These concepts are illustrated in Figure 2…14。 With value types; when one value type is assigned to another; the contents are copied。 If you modify one of the copies; the original will not be altered。 In contrast; when you change the value of a reference type; the values of all the pointers to that reference type change。 Going back to the credit card and cash example; if you have 10 and so does your spouse; then when you spend 8; it does not affect the 10 that your spouse has; as befits the value