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 스펙은 대문자와 소문자 접미사를 모두 허용하지만 longs에 대한 대문자 버전 이 선호됩니다. 대문자가 소문자 보다 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있습니다.
답변
