Why int j = 012 giving output 10?
The leading zero means the number is being interpreted as octal rather than decimal.
You are assigning a constant to a variable using an octal representation of an type int constant. So the compiler gets the integer value out of the octal representation 010 by converting it to the decimal representation using this algorithm 0*8^0 + 1+8^1 = 10 and then assign j to 10. Remember when you see a constant starting with 0 it's an integer in octal representation. i.e. 0111 is not 1 hundred and 11 but it's 1*8^0 + 1*8^1 + 1*8^2.
Than I change 012 to 0123 and now it is giving output 83?
Because, it's taken as octal base (8), since that numeral have 0 in leading. So, it's corresponding decimal value is 10.
012 :
(2 * 8 ^ 0) + (1 * 8 ^ 1) = 10
0123 :
(3 * 8 ^ 0) + (2 * 8 ^ 1) + (1 * 8 ^ 2) = 83
If a number is leading with 0, the number is interpreted as an octal number, not decimal. Octal values are base 8, decimal base 10.
System.out.println(012):
(2 * 8 ^ 0) + (1 * 8 ^ 1) = 10
12 = 2*8^0 + 1*8^1 ---> 10
System.out.println(0123)
(3 * 8 ^ 0) + (2 * 8 ^ 1) + (1 * 8 ^ 2) = 83
123 = 3*8^0 + 2*8^1 + 1*8^2 ---> 83