Date post: | 11-Dec-2015 |
Category: |
Documents |
Upload: | ashtyn-mauger |
View: | 217 times |
Download: | 0 times |
Literals
• Why does this produce an error?
float x = 2.5;
Literals
• Floating-point default datatype is ‘double’.
float x = 2.5;
Literals
• Solution 1: cast 2.5 to float
float x = (float) 2.5;
Literals
• Solution 2: use ‘f’ or ‘F’ identifier
float x = 2.5f;
Literals
• char literals are delimited by single quotes
char c = ‘a’;
Literals
char c = ‘a’;int x = 3 + c;
System.out.println( x );
boolean
floating pointintegral
float doubleboolean char short int long
character integer
byte16+
8+/-
16+/-
32+/-
64+/-
32+/-
64+/-
numeric
Literals
• char is a numeric integral type (i.e. evaluates to an integer
• What is the output?
char c = ‘a’;int x = 3 + c;
System.out.println( x );
Literals
char c = ‘a’;char c = ‘\u0061’;
• Unicode escape sequence is backslash + u + 4 digit hex
• Unicode can be used ANYWHERE in java code
Literals
ch\u0061r c = ‘\u0061’;
Numeric Promotion
int x = 3 / 2 * 4
• 3,2 and 4 are int literals• Integer Division!• Result of 3 / 2 is : 1• Therefore, x=3/2*4 is the same as x=1*4• x = 4 !
Numeric Promotion
int x = 3 / 2 * 4f
Numeric Promotion
int x = 3 / 2 * 4f
• The ‘f’ denotes ‘float’ datatype
Numeric Promotion
int x = 3 / 2 * 4f
• The ‘f’ denotes ‘float’ datatype• The binary operator ‘/’ must have same
datatype on both sides. Therefore, 2 is promoted to float datatype
Numeric Promotion
int x = 3 / 2 * 4f
• The ‘f’ denotes ‘float’ datatype• The binary operator ‘/’ must have same
datatype on both sides. Therefore, 2 is promoted to float datatype
• Now the binary operator ‘*’ must promote its right hand operand. 4 is promoted to float.
Numeric Promotion
int x = 3 / 2 * 4f
• The right hand expression evaluates to 6.0• This will not compile because float to integer
is a narrowing conversion requiring an explicit cast
Numeric Promotion
int x = (int) 3 / 2 * 4f
• Explicit cast !• System.out.print (x) : 4
Numeric Promotion
float x = 3 / 2 * 4f
• cast not needed• System.out.print (x) : 6.0
Numeric Promotion
float x = 3 / 2 * 4f
• Another method!
Numeric Promotion
float x = 3.0 / 2 * 4
• Another method!• Literals are promoted to which datatype???
Numeric Promotion
float x = 3.0 / 2 * 4
• Another method!• Literals are promoted to ‘double’ datatype
Numeric Promotion
float x = 3.0 / 2 * 4
• Another method!• Literals are promoted to ‘double’ datatype• This expression will not compile because it
requires an explicit narrowing conversion from double to float
Numeric Promotion
float x = (float) 3.0 / 2 * 4
• Finished!
Numeric Promotion
float x = (float) 3.0 / 2.0 * 4
• Does not compile.. Cast only operates on left hand operand 3.0
Numeric Promotion
float x = (float) (3.0 / 2.0) * 4
• Phew!
Finally !
• evaluates left to right• 3 / 2 is integer division, result is 1• Int 1 is promoted to double 1.0• 1.0 * 4.0 evaluates to double 4.0
double x = 3 / 2 * 4.0
Literals
• What is the output?
int x = 2147483647 + 1;System.out.println( x );
Literals
• Int datatype is 32 bits: 1 sign bit + 31 bits to represent the number
• Sign bit: 0 means positive, 1 means negative
0 1111111 11111111 11111111 11111111
Sign bit: +/-
Literals
0 1111111 11111111 11111111 11111111+
0 0000000 00000000 00000000 00000001=
1 0000000 00000000 00000000 00000000
Sign bit is now 1
Literals
0 1111111 11111111 11111111 11111111+
0 0000000 00000000 00000000 00000001=
1 0000000 00000000 00000000 00000000
2,147,483,647
1
- 2,147,483,648
Implicit Narrowing Conversion
0 1000000 10000001
• What is the decimal value of this bit pattern?
Implicit Narrowing Conversion
0 1000000 10000001
• 16513 ( 16384 + 128 + 1 )
Implicit Narrowing Conversion
0 1000000 10000001
short x = 16513;‘16513’ is an integer literal. Default type is ‘int’. No cast required here because integral types (including ‘char’) can perform ‘implicit narrowing conversion’ as long as the value is in range. ( float c = 2.5 is illegal, because floating point types cannot perform implicit narrowing conversion.)
Implicit Narrowing Conversion
• Rule 1: Both datatypes must be integer types• Rule 2: Value must be within range of target
datatype
loss of precision with casting
0 1000000 10000001
short x = 16513;byte b = (byte) x;
loss of precision with casting
short x = 16513;byte b = (byte) x;
0 1000000 10000001
bye, bye….
loss of precision with casting
short x = 16513;byte b = (byte) x;
0 1000000 10000001
Value of x is -127