2009-04-20 9 views
74

Java에서 숫자를 입력하면 컴파일러에서이를 자동으로 정수로 읽습니다. 따라서 (long) 6000000000 (정수 범위가 아님)을 입력하면 6000000000은 정수가 아니라고 불평합니다. 이 문제를 해결하려면 6000000000L을 지정해야했습니다. 방금이 사양에 대해 배웠습니다.Java의 L 번호 (long) 사양

short, byte, float, double과 같은 다른 숫자 사양이 있습니까? 그것은 당신이 입력하는 번호를 지정할 수 있다면 (나는 가정) 짧은 것입니다 다음 Java는 그것을 캐스팅하지 않아도 될 것이라고 - 왜냐하면 내가 틀렸다면 가정 해, 올바른 날이 될 것 같습니다 . 나는 보통이 질문을 스스로 찾아 볼 것이지만, 이런 종류의 숫자 명세가 불려지는지 알지 못한다.

답변

143

(예 2.4f) long (예컨대 39832L) floatdouble (예컨대 -7.832d) 특정 접미사있다.

접미어가없고 정수 유형 (예 : 5623) 인 경우 int으로 간주됩니다. 정수 유형 (예 : 3.14159)이 아닌 경우 double으로 가정합니다.

다른 모든 경우 (byte, short, char)에는 구체적인 접미사가 없기 때문에 캐스트가 필요합니다. L 하부 케이스 l보다 부호 1 혼동 덜 쉽게 상부 케이스로서

자바 스펙 소문자 접미사 둘 수 있지만 long 초 동안 상부 케이스 버전이 바람직하다.

자세한 내용은 JLS section 3.10을 참조하십시오 (정의는 IntegerTypeSuffix 참조).

+7

늦은 항목 : 모호성의 잠재적 인 원인을 제거하는 것은 항상 좋은, 그리고 * 나는 ... * 동의하지 않지만 당신이 l''와 1''자신이 혼란을 발견하면 저는 믿습니다 'O'등으로 '0'을 입력하면 * 우선 순위 *는 글꼴을 올바르게 설정 한 다음 (Shift 키를 놓치지 않도록) 걱정할 필요가 없습니다. – davidcesarino

+0

@SimonNickerson 접미어에 대한 질문이 있습니다 ... 'long _lo = 30;'과 같이 _long_ 또는 _double_ 변수를 선언하고 '30L'이 아닌 경우에는 내 변수가 _float_로 변환됩니다. 또는'_lo = _lo + 2.77'의 경우에는 _llo_ – luigi7up

+0

으로 선언되었지만 _lo이 _에 캐스팅됩니다. float는 여기에 포함되지 않습니다. 첫 번째 경우,'30'은'long'으로 자동으로 변환되어 변환되는'int'입니다.두 번째 경우 귀하의 진술은 불법입니다. 오른쪽 사이드를 명시 적으로 길게 캐스트해야합니다 (예 : '_lo = (long) (_lo + 2.77)' –

0

고려 :

long l = -1 >>> 1; 

int a = -1; 
long l = a >>> 1; 

대 이제 변수 l에 같은 값을 제공하는 코드 조각을 귀찮게 기대. 따라서 int 리터럴의 표현식을 int으로 지정해야합니다.

8

이들은 리터럴이며 Java 언어 스펙의 section 3.10에 설명되어 있습니다.

12

은 당신이 약간의 탄젠트를 신경 쓰지 희망,하지만 당신은 (오랫동안) (플로트에 대한) F, D (더블 용) 및 L, a proposal has been made 외에 byte에 대한 접미사를 추가하는 것을 알고 관심이있을 수 있습니다 생각 shortYS입니다. 바이트 (또는 짧은) 배열에 리터럴 구문을 사용하면 바이트로 변환 할 필요가 없습니다. 제안서의 예제 인용 :

주요 이점 : 제안이 채택되면 플랫폼이 인 이유는 무엇입니까?

byte[] stuff = { 0x00, 0x7F, (byte)0x80, (byte)0xFF}; 

같은

cruddy 코드는

byte[] ufum7 = { 0x00y, 0x7Fy, 0x80y, 0xFFy }; 

조 다아시는 자바 7 프로젝트 동전을 감독하고 같이 코딩 할 수 있으며, his blog는 이러한 제안을 쉽게 추적 할 수있다. 당신이 당신이 입력하는 번호를 지정 할 수 있다면 이러한 (I 가정) 때문에 이 가지고에 좋은 것 같은

+0

그게 좋을 것 ... 나는 항상 모든 캐스트가 정말 성가신 것을 발견했습니다 – jbu

+0

나는 이것을 Java 7로 만들지 않았다. 미래의 업데이트 또는 Java 8로 만들면 어떤 단어가 나올까? – crush

+0

@crush 나는 몇 달 전에 그것을 조사해 보았다. 그리고 내가 말할 수있는 한, 그 제안은 버려졌다. 우리는 숫자 리터럴과 바이너리 리터럴의 접두사 '0b'를 얻었습니다. 탁탕 치다. – erickson

1

짧은 다음 자바는 캐스트를하지 않았을 것 같다 그것을

리터럴 구문 분석은 컴파일 타임에 발생하므로 성능과 관련이 없습니다. shortbyte 접미사를 사용하는 유일한 이유는 더 간결한 코드로 이어질 수 있다는 것입니다.

3

기본적으로 모든 기본 원시 데이터 형식 (byte, short, int, long)은 java 컴파일러에서 int 유형으로 처리됩니다. 바이트이 짧은 인 경우 할당 된 값이 범위 내에있는 한 문제가 없으며 접미사가 필요하지 않습니다. 바이트에 할당 된 값이 일 경우 해당 범위를 초과하면 명시 적 유형 전송이 필요합니다.

예 :

byte b = 130; // CE: range is exceeding. 

이 타입 캐스팅을 수행 극복하기 위해.

byte b = (byte)130; //valid, but chances of losing data is there. 

긴 데이터 형식의 경우 정수 값을 수락 할 수 있습니다. 우리가 다음과 같이 지정한다고 가정하십시오.

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 한 유형을 치료하는 L로 접미사를 넣어해야합니다.

그래서 결국

Long l = 2147483648L;// works fine.