Java에서 숫자를 입력하면 컴파일러가 자동으로 정수로 읽는 것처럼 보이므로 6000000000
(정수 범위가 아닌 ) (정수 범위 6000000000
가 아닌) 입력하면 정수가 아니라고 불평합니다 . 이를 수정하기 위해 6000000000L
. 이 사양에 대해 방금 배웠습니다.
short, byte, float, double과 같은 다른 숫자 사양이 있습니까? 입력하는 숫자를 지정할 수 있다면 자바가 캐스트 할 필요가 없기 때문에 이것들이 있으면 좋을 것 같습니다. . 나는 일반적 으로이 질문을 직접 검색하지만 이러한 종류의 숫자 사양이 무엇인지조차 모릅니다.
답변
특정에 대한 접미사가 있습니다 long
(예를 들어 39832L
), float
(예 2.4f
) 및 double
(예를 들어 -7.832d
).
접미사가없고 정수 유형 (예 5623
🙂 인 경우 int
. 정수 유형이 아닌 경우 (예 3.14159
🙂 double
.
다른 모든 경우에 ( byte
, short
, char
특정 접미사가 없기 때문에), 당신은 캐스트가 필요합니다.
Java 스펙은 대문자와 소문자 접미사를 모두 허용하지만 long
s에 대한 대문자 버전 이 선호됩니다. 대문자가 소문자 보다 L
숫자와 혼동하기 쉽지 않기 1
때문 l
입니다.
자세한 내용은 JLS 섹션 3.10 을 참조하십시오 (의 정의 참조 IntegerTypeSuffix
).
답변
나는 당신이 약간의 탄젠트를 신경 쓰지 희망하지만 외에 당신이 알고 관심이있을 수 있습니다 생각 F
(플로트 용), D
(더블 용) 및 L
(긴), 제안이 이루어진 대한 접미사를 추가 byte
하고 short
– Y
그리고 S
각각 . 이렇게하면 바이트 (또는 짧은) 배열에 리터럴 구문을 사용할 때 바이트로 캐스팅 할 필요가 없습니다. 제안서의 예를 인용 :
주요 이점 : 제안이 채택되면 플랫폼이 더 좋은 이유는 무엇입니까?
엉뚱한 코드
byte[] stuff = { 0x00, 0x7F, (byte)0x80, (byte)0xFF};
다음과 같이 레코딩 될 수 있습니다.
byte[] ufum7 = { 0x00y, 0x7Fy, 0x80y, 0xFFy };
Joe Darcy는 Java 7 용 Project Coin을 감독하고 있으며 그의 블로그 는 이러한 제안을 추적하는 쉬운 방법이었습니다.
답변
기본적으로 모든 정수 기본 데이터 유형 (byte, short, int, long)은 Java 컴파일러에서 int 유형 으로 처리됩니다 . 들어 바이트 와 짧은 만큼 자신에게 할당 된 값이 그 범위에서와 같이, 문제 및 필요 없음 접미사가 없습니다. byte 및 short에 지정된 값 이 범위를 초과하면 명시 적 유형 캐스팅이 필요합니다.
전의:
byte b = 130; // CE: range is exceeding.
이를 극복하기 위해 유형 캐스팅을 수행합니다.
byte b = (byte)130; //valid, but chances of losing data is there.
Long 데이터 타입의 경우 번거 로움없이 정수 값을 수용 할 수 있습니다. 다음과 같이 할당한다고 가정합니다.
Long l = 2147483647; //which is max value of int
이 경우 L / l과 같은 접미사가 필요하지 않습니다. 기본값으로 2147483647은 Java 컴파일러가 int 유형으로 간주됩니다. 내부 유형 캐스팅은 컴파일러에 의해 수행되며 int는 Long 유형으로 자동 승격됩니다.
Long l = 2147483648; //CE: value is treated as int but out of range
여기서 우리는 리터럴 2147483648을 자바 컴파일러에 의해 long 타입으로 취급하기 위해 접미사를 L로 넣어야합니다.
그래서 마침내
Long l = 2147483648L;// works fine.
답변
이들은 리터럴이며 Java 언어 사양의 섹션 3.10 에 설명되어 있습니다.
답변
입력하는 숫자를 지정할 수 있다면 자바가 그것을 캐스팅 할 필요가 없기 때문에 이것들이 있으면 좋을 것 같습니다.
리터럴의 구문 분석은 컴파일 시간에 발생하므로 성능과 관련하여 절대적으로 관련이 없습니다. short
및 byte
접미사가있는 유일한 이유 는 더 간결한 코드로 이어지기 때문입니다.
답변
int
와 long
리터럴 을 구분 해야하는 이유를 이해하려면 다음을 고려하십시오.
long l = -1 >>> 1;
대
int a = -1;
long l = a >>> 1;
이제 당연히 예상했듯이 두 코드 조각 모두 variable에 동일한 값을 제공합니다 l
. 구별 할 수 int
없고 long
문자 그대로의 해석은 -1 >>> 1
무엇입니까?
-1L >>> 1 // ?
또는
(int)-1 >>> 1 // ?
따라서 숫자가 공통 범위에 있더라도 유형을 지정해야합니다. 기본값이 리터럴의 크기로 변경되면 숫자를 변경하는 것만으로도 표현식 해석에 이상한 변화가있을 것입니다.
이 발생하지 않습니다 byte
, short
그리고 char
그들은 항상 연산 및 비트 연산을 수행하기 전에 승진 때문이다. 아마도 그것들은 배열 초기화 표현식에서 사용하기위한 정수형 접미사 여야하지만 그렇지 않습니다. float
접미사 f
및 double
d
. 다른 리터럴에는 모호하지 않은 유형이 있으며에 대한 특수 유형이 null
있습니다.