long a2 = 100L * 1024 * 1024 * 1024;
그러나이 작업에서는 적어도 하나의 피연산자입니다 long
. 따라서 작업은 64 비트 정밀도를 사용하여 수행되며 수치 연산자의 결과는 유형입니다. long
. 다른 비 긴 피연산자는 유형으로 넓어집니다 long
~에 의해 숫자 프로모션 결과 값이 변수에 저장됩니다 a2
.
long a1 = 100 * 1024 * 1024 * 1024;
평범한 정수의 일정한 표현, 표현의 결과는 유형으로 계산되었습니다. int
. 계산 된 값은 너무 크지 만 정수에 맞지 않아 오버플로 이어져 0
그리고 저장됩니다 a1
변하기 쉬운.
편집 : 다음 주석에서 묻는대로 :
왜 부정적이지 않습니까?
들어가는 동안 정수 계산 두 번째 계산은 동일합니다 25 * 2^32
어디 ^
힘의 의미와 2^32
정수 가치입니다 0
. 그러나 그것이 왜 가치인지 설명하기 위해 0
: 바이너리 :
100 * 1024 * 1024 * 1024 == 25 * 2^32;
Integer.MAX_VALUE = 2 ^ 31 -1 = 0 11111111 11111111 11111111 1111111
Integer.MAX_VALUE + 1 = 2 ^ 31 = 1 00000000 00000000 00000000 0000000
2 ^ 31
부정적인 정수입니다 (-2147483648
) 사인 비트로 1
따라서 2 ^ 32
단지 곱셈입니다 2
에게 2 ^ 31
: 왼쪽 시프트가 발생하면 부호 비트가됩니다. 0
따라서 결과는입니다 0
.
확인하십시오 java language specification: 4.2.2: Integer operation
자세한 내용은.