[java] Java의 L 번호 (긴) 사양

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하고 shortY그리고 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 유형 으로 처리됩니다 . 들어 바이트짧은 만큼 자신에게 할당 된 값이 그 범위에서와 같이, 문제 및 필요 없음 접미사가 없습니다. byteshort에 지정된 값 이 범위를 초과하면 명시 적 유형 캐스팅이 필요합니다.

전의:

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 에 설명되어 있습니다.


답변

입력하는 숫자를 지정할 수 있다면 자바가 그것을 캐스팅 할 필요가 없기 때문에 이것들이 있으면 좋을 것 같습니다.

리터럴의 구문 분석은 컴파일 시간에 발생하므로 성능과 관련하여 절대적으로 관련이 없습니다. shortbyte접미사가있는 유일한 이유 는 더 간결한 코드로 이어지기 때문입니다.


답변

intlong리터럴 을 구분 해야하는 이유를 이해하려면 다음을 고려하십시오.

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접미사 fdouble d. 다른 리터럴에는 모호하지 않은 유형이 있으며에 대한 특수 유형이 null있습니다.


답변