Java의 L 번호 (긴) 사양


96

Java에서 숫자를 입력하면 컴파일러가 자동으로 정수로 읽는 것처럼 보이므로 6000000000(정수 범위가 아닌 ) (정수 범위 6000000000가 아닌) 입력하면 정수가 아니라고 불평합니다 . 이를 수정하기 위해 6000000000L. 이 사양에 대해 방금 배웠습니다.

short, byte, float, double과 같은 다른 숫자 사양이 있습니까? 입력하는 숫자를 지정할 수 있다면 자바가 캐스트 할 필요가 없기 때문에 이것들이 있으면 좋을 것 같습니다. . 나는 일반적 으로이 질문을 직접 검색하지만 이러한 종류의 숫자 사양이 무엇인지조차 모릅니다.

답변:


174

특정에 대한 접미사가 있습니다 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).


9
늦은 항목 : 모호성의 잠재적 인 원인을 제거하는 것은 항상 좋은, 그리고 나는 동의하지 않습니다 ...하지만 당신은 자신이 혼란을 발견하면 나는 생각 1l0함께 O(등), 당신의 우선 순위 (글꼴 권리를 설정하는 것입니다 당신이 할 수있는 경우 ) 그런 다음 Shift 키를 놓치지 않도록 걱정하십시오.
davidcesarino

@SimonNickerson 접미사에 대한 질문이 있습니다 ... 만약 내가 long 또는 double 변수를 다음 long _lo = 30;과 같이 선언한다면 : 30L이것이 내 변수가 float 로 변환된다는 것을 의미하지 않습니까? 또는 _lo = _lo + 2.77그 경우에는 오랫동안 선언되었지만 float_lo 로 캐스팅됩니다
luigi7up

아니요, 수레는 여기에 포함되지 않습니다. 첫 번째 경우, 30int자동으로 확대 변환에 의해 변환되는 얻는다 long. 두 번째 경우, 귀하의 진술은 불법입니다. 당신은 예를 들어, 긴 명시 적 캐스트 오른쪽에있는 것_lo = (long) (_lo + 2.77)
사이먼 Nickerson

4
@DavidCesarino는 글꼴을 변경하여 모호함을 수정합니다. 특정 편집기에서 올바르게 설정했습니다. l을 L로 변경하면 다른 편집기, IDE에서 코드를 읽고 웹에서 소스 (검토 도구, 리포지토리 등)를 볼 때 자신을 포함하여 코드를 읽을 수있는 모든 사람 의 모호성이 수정 됩니다. IMHO 우선 순위는 Shift 키를 놓치지 않는 것입니다. Btw. 어떤 글꼴을 추천합니까? 나는 고정 폭을 좋아하고 내가 본 거의 모든 편집기, CLI 등에서 기본값 이며이 글꼴 l1( 0Oresp.) 상당히 유사합니다.
dingalapadum

1
@dingalapadum 내가 말했듯이, 당신이 맞습니다. 모호성의 원인을 제거하는 것은 확실히 옳은 일입니다. 쉽게 착각 할 수있는 편집기는 사용하지 말아야한다고 말씀 드렸습니다. 즉, 방어 적으로 코딩하는 오래된 제안이지만 그것에 의존하지 않습니다. 글꼴에 관해서는 매우 개인적이지만 1) 고정 폭이기 때문에 가능한 한 항상 Deja Vu Sans Mono를 사용합니다. 2) 문자간에 모호성이 없습니다. 그리고 3) 나는 그것의 모양, 아름답고 우아하고, 거의 좋고, 읽기 쉬운 sans-serif 글꼴과 같다. (다른 좋은 프로그래밍 글꼴은 너무 "금속적인"IMHO를 느낀다).
davidcesarino

13

나는 당신이 약간의 탄젠트를 신경 쓰지 희망하지만 외에 당신이 알고 관심이있을 수 있습니다 생각 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을 감독하고 있으며 그의 블로그 는 이러한 제안을 추적하는 쉬운 방법이었습니다.


그것은 좋을 것입니다 ... 나는 항상 모든 캐스트가 정말 짜증나는 것을 발견했습니다
jbu

나는 이것이 자바 7로 만들어지지 않았다고 생각한다. 그것이 그것이 미래의 업데이트 나 자바 8로 만들어 질지에 대한 어떤 말?
crush

@crush 몇 달 전에 조사해 보았는데 제가 알 수있는 한 제안은 취소되었습니다. 우리는 숫자 리터럴에서 _를 얻었고 0b이진 리터럴 의 접두사를 얻었습니다 . 탁탕 치다.
erickson 2013-08-28

이 제안은 아마 오라클 원하지 않는 사회가 슬프게도, 작업에 ... 우리가 아직이 제안에 대해 아무것도 2018에있어없고, 어떻게 그들에게 대신 자바의 코 틀린에 구현
JoelBonetR

11

기본적으로 모든 정수 기본 데이터 유형 (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.


1

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

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


0

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있습니다.


나는 당신이 과거에 의미했던 것에 정말로 관심이있을 것입니다. 두 경우 모두 2147483647을 얻었고 다른 것을 기대해야하는 이유를 이해하지 못합니다.
놀라운 1

@TheincredibleJan 당신은 당연히 기대할 것입니다 Integer.MAX_VALUE. 그러나 intlong리터럴 을 구별 할 방법이 없다면 그것은 모호 할 것입니다. / 나는이 질문을 기억하지 못하지만 어쨌든 내 대답을 명확히했다.
Tom Hawtin-tackline
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.