450 likes | 768 Views
Literals. Integer literals:. Octal: 010, 027L, 017777777777 Hexadecimal: 0x8, 0xaL, 0x7fffffff Binary: 0b1000, 0b101010L Decimal: 8, 64, 2147483647. Literals. String literals:. “A” “Hello” “This is a good day for learning java.”. Literals. float x = 2.5;.
E N D
Literals Integer literals: • Octal: 010, 027L, 017777777777 • Hexadecimal: 0x8, 0xaL, 0x7fffffff • Binary: 0b1000, 0b101010L • Decimal: 8, 64, 2147483647
Literals String literals: • “A” • “Hello” • “This is a good day for learning java.”
Literals float x = 2.5; • Why does this produce an error?
Literals float x = 2.5; • Floating-point default datatype is ‘double’.
Literals float x = (float) 2.5; • Solution 1: cast 2.5 to float
Literals float x = 2.5f; • Solution 2: use ‘f’ or ‘F’ identifier
Literals char c = ‘A’; • char literals are delimited by single quotes
Literals char c = ‘A’; int x = 45 + c; System.out.println( x );
numeric boolean integral floatingpoint character integer boolean char byte short int long float double 16 + 8 +/- 16 +/- 32 +/- 64 +/- 32 +/- 64 +/-
Literals char c = ‘A’; int x = 45 + c; System.out.println( x ); • char is a numeric integral type (i.e. evaluates to an integer • What is the output?
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 * 4 f
Numeric Promotion int x = 3 / 2 * 4 f • The ‘f’ denotes ‘float’ datatype
Numeric Promotion int x = 3 / 2 * 4 f • 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 * 4 f • 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 * 4 f • 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 * 4 f • Explicit cast ! • System.out.print (x) : 4
Numeric Promotion float x = 3 / 2 * 4 f • cast not needed • System.out.print (x) : 6.0
Numeric Promotion float x = 3 / 2 * 4 f • 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 ! double x = 3 / 2 * 4.0 • 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
Literals long x = 2147483647; • What datatype is the literal?
Literals long x = 2147483648; • Why does the above produce an error? • By default, integer literals are datatype ‘int’, and 2,147,483,648 is out of range.
Literals long x = 2147483648L; • Solution: must use the ‘l’ or ‘L’ identifier
Literals int x = 2147483647 + 1; System.out.println( x ); • What is the output?
Literals 0 1111111 11111111 11111111 11111111 Sign bit: +/- • Int datatype is 32 bits: 1 sign bit + 31 bits to represent the number • Sign bit: 0 means positive, 1 means negative
Literals 0 1111111 11111111 11111111 11111111 + 0 0000000 00000000 00000000 00000001 = 1 0000000 00000000 00000000 00000000 Sign bit is now 1
Literals 2,147,483,647 0 1111111 11111111 11111111 11111111 + 0 0000000 00000000 00000000 00000001 = 1 0000000 00000000 00000000 00000000 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
Exercise! int x = 457; double y = (byte) x; System.out.print( y );