Copyright © 2013 Curt Hill Enterprise Architecture What is it?
Copyright 2005-2007 Curt Hill Casts What are they? Why do we need them?
-
Upload
derrick-maxwell -
Category
Documents
-
view
222 -
download
0
Transcript of Copyright 2005-2007 Curt Hill Casts What are they? Why do we need them?
Copyright 2005-2007 Curt Hill
Casts
What are they?Why do we need them?
Copyright 2005-2007 Curt Hill
Mixed Mode Arithmetic
• Multiple types in one arithmetic expression– 3.5 * 2– A real and integer constant
• Most programming languages allow some form of mixed mode
• C and C++ are quite liberal• Java somewhat more restrictive
Copyright 2005-2007 Curt Hill
Better Example• Suppose:int a=2, b;double d;cin >> b >> d;d = d*b – a; a = b*d – a;
• What is the difference?• One loses information and the
other does not!
Copyright 2005-2007 Curt Hill
Conversions• C++ will perform certain
conversions automatically• Converting an integer value to a
double value is automatic– Doubles are stronger– This conversion does not lose anything
• The conversion from double to int will also be done automatically– Even though information is lost
Copyright 2005-2007 Curt Hill
When is the conversion done?
• Consider the following:int a=2, b=3;double d = 3;d = a/b;
• What do we get?• From an algebra view: 2/3 should
be .6666…• Actually we get zero
Copyright 2005-2007 Curt Hill
Why zero?
• C++ only looks at the immediate pair of operands and refuses to look ahead
• So it first does a/b, which is 2/3• Since both are integers, we do
integer division• This gives a zero
Copyright 2005-2007 Curt Hill
Observations
• C++ is very short sighted• Even though the resulting
expression of:d = a/b*d;is double, it does no conversion until needed
• It avoids some thornier problems by doing so
Copyright 2005-2007 Curt Hill
So what is the fix?
• How do we get 2/3 instead of zero?• A cast
– A cast is a conversion of type from one type to another
• The variable type is not changed!• We extract the value and change
the type of that value
Styles of Casts• The compiler will do a cast
automatically for mixed mode arithmetic– For operators convert weaker to
stronger– For assignments convert to receiving
type
• C style cast• C++ style cast
Copyright 2005-2007 Curt Hill
Copyright 2005-2007 Curt Hill
The C Cast
• The form of a cast is the type in parenthesis
• This is a unary operator, it takes the operand on its right and converts the value into the appropriate type:(double)a/b
• It has very high precedence so it occurs before the division
Copyright 2005-2007 Curt Hill
The C++ Cast• C++ introduced a cast that looks
like a function call or constructordouble(a)/b
• Use the type name like a function name
• Precedence is not an issue• This can only be used for types
with a single name– Use
(long double)a/bfor multiple names
Copyright 2005-2007 Curt Hill
The 2/3 problem solved
• We have two ways to accomplish what we wanted:d = double(a)/b;d = (double)a/b;d = a/double(b);
• These work, but these do not:d = (double)(a/b);d = double(a/b);– The damage is already done
Copyright 2005-2007 Curt Hill
Rounding• How is a double converted into an
int?• Truncation!
– (int)0.99999 is zero!
• How do we round?• Simple: add 0.5 prior to the cast• (int)(0.9999 + 0.5) is• (int)(1.4999) is• 1