What are the Java semantics of an escaped number in a character literal, e.g. '\15' ?

JavaSyntaxCharacterLiteralsOctal

Java Problem Overview


Please explain what, exactly, happens when the following sections of code are executed:

int a='\15';
System.out.println(a);

this prints out 13;

int a='\25';
System.out.println(a);

this prints out 21;

int a='\100';
System.out.println(a);

this prints out 64.

Java Solutions


Solution 1 - Java

You have assigned a character literal, which is delimited by single quotes, eg 'a' (as distinct from a String literal, which is delimited by double quotes, eg "a") to an int variable. Java does an automatic widening cast from the 16-bit unsigned char to the 32-bit signed int.

However, when a character literal is a backslash followed by 1-3 digits, it is an octal (base/radix 8) representation of the character. Thus:

  • \15 = 1×8 + 5 = 13 (a carriage return; same as '\r')
  • \25 = 2×8 + 5 = 21 (a NAK char - negative acknowledgement)
  • \100 = 1×64 + 0×8 + 0 = 64 (the @ symbol; same as '@')

For more info on character literals and escape sequences, see JLS sections:

Quoting the BNF from 3.10.6:

OctalEscape:
    \ OctalDigit
    \ OctalDigit OctalDigit
    \ ZeroToThree OctalDigit OctalDigit

OctalDigit: one of
    0 1 2 3 4 5 6 7

ZeroToThree: one of
    0 1 2 3

Solution 2 - Java

The notation \nnn denotes an octal character code in Java. so int a = '\15' assigns the auto-cast'ed value of octal character 15 to a which is decimal 13.

Solution 3 - Java

The fact that you put the digits in quotes makes me suspect it is interpreting the number as a character literal. The digits that follow must be in octal.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionVArView Question on Stackoverflow
Solution 1 - JavaBohemianView Answer on Stackoverflow
Solution 2 - JavaBahmanMView Answer on Stackoverflow
Solution 3 - JavaNikhilView Answer on Stackoverflow