Short Value Java 설정


114

J2ME에서 약간의 코드를 작성하고 있습니다. 메서드가있는 클래스가 setTableId(Short tableId)있습니다. 이제 작성하려고 할 때 setTableId(100)컴파일 시간 오류가 발생합니다. 다른 short 변수를 선언하지 않고 어떻게 short 값을 설정할 수 있습니까?

Long값을 설정할 때 사용할 수 setLongValue(100L)있고 작동합니다. 그렇다면 L여기서 의미 는 무엇이며 Short가치에 대한 성격은 무엇 입니까?

감사


Llong리터럴 을 나타내는 데 사용되는 접미사 입니다.
missingfaktor

답변:


174

Java에서 정수 리터럴은 기본적으로 int 유형입니다. 다른 유형의 경우와 같은 대소 문자를 구분 문자로 문자 그대로의 접미사 수 L, D, F각각, 긴, 더블, 또는 플로트를 지정할 수 있습니다. 가독성을 높이기 위해 대문자를 사용하는 것이 일반적입니다.

Java 언어 사양은 바이트 또는 짧은 유형에 대해 동일한 구문 설탕을 제공하지 않습니다. 대신 명시 적 캐스팅을 사용하여이를 선언 할 수 있습니다.

byte foo = (byte)0;
short bar = (short)0;

당신의에서 setLongValue(100L)메서드 호출, 당신은 포함 반드시 할 필요는 없습니다 L이 경우에는 INT의 문자가 자동으로 오래에 확대되기 때문에 접미사. 이를 Java 언어 사양에서 확장 기본 변환이라고합니다.


16
다른 유형의 접미사도 있습니다 : d/ Dmakes a doubleand f/ Fmakes a float!
Joachim Sauer

6
또한 : 크기에 맞는 리터럴은 캐스트 할 필요가 없습니다. 두 예제는 캐스트 없이도 작동합니다.
Joachim Sauer

당신은 둘 다 옳습니다. 여기서는 부동 소수점 리터럴이 아니라 정수 리터럴에 대해 이야기하고 있다는 것이 더 분명해야합니다.
Lauri

4
@Joachim : J5 +에만 캐스트가 필요하지 않습니다. J2ME는 불행히도 여전히 J4에 있습니다 (심각하게 제거 된 J4).
Lawrence Dol

2
@JoachimSauer, "크기에 맞추기"란 무엇을 의미합니까? 난 그냥 특별히 캐스팅했기 때문에 내가 부탁 해요 0(short)0해결하기 위해 possible lossy conversion from int to short0이 짧은 경우에도 오류가 발생했습니다.
ryvantage

34

바이트 또는 짧은 리터럴과 같은 것은 없습니다. 짧게 캐스트해야합니다.(short)100


9

일반적으로 변수를 캐스트하여 short.

혼란 스러울 수있는 이와 같은 문제가 발생할 수도 있습니다. 이는 +운영자가int

여기에 이미지 설명 입력

요소를 캐스팅해도 도움이되지 않습니다.

여기에 이미지 설명 입력

표현식을 캐스팅해야합니다.

여기에 이미지 설명 입력


1
short + short = int라는 이유가 있다는 것을 잊지 마십시오. 두 쇼트의 합이 기계의 최대 쇼트 값보다 높으면 쇼트로 캐스팅하면 예상치 못한 결과가 발생하거나 languaje에서 지원하는 경우 예외가 발생합니다.
DGoiko

2
이 논리로 두 개의 int를 추가하면 long이 반환됩니다.)
matt은

1
그리고 내 합계가 Integer.MAX_VALUE를 초과 할 수 있는지 찾습니다. 나는 int를 반환하는 결정을 옹호하는 것이 아니라 (아마도 HW가 실제로 합계를 수행하는 방식과 관련이있을 것입니다), 사람들이 결과가 실제로 짧은 부분에 채워져 있는지 확인해야한다는 것입니다. 나는 아마도 관련된 숫자의 크기 때문에 int를 제한하는 것보다 짧은 용량을 제한하는 버그를 더 많이 접했습니다. 짧은 캡을위한 2 개의 작은 바이트 자바
예약자

1
나는 내 의견을 다시 읽었고 내 요점을 명확히하지 않았습니다. 첫 번째 문장은 혼란스러워서 그 말을하지 말았어야했고 나머지는 그냥 남겨두고 두 개의 관련 문장이있는 것 같습니다. short + short가 int 인 이유는 여기에서 읽을 수 있습니다 : docs.oracle.com/javase/specs/ jvms / se8 / html /… , JVM에는 짧은 합계 연산이 없습니다. Java의 int는 32 비트이고이 결정이 내려 졌을 때 대부분의 컴퓨터는 32 비트 였으므로 int가 가장 좋은 아이디어처럼 보였습니다.
DGoiko

1
또한 여기에 설명 된대로 stackoverflow.com/a/27123302/9465588 은 JVM이 실제로 클래스 필드 당 가상 메모리 공간의 32 비트 이상을 서버로 처리 했으므로 짧은 필드를 선언해도 메모리가 전혀 절약되지 않습니다. Java가 이것을 변경했는지 모르겠습니다. DAO
DGoiko

8

사용할 수 있습니다 setTableId((short)100). 나는 이것이 Java 5에서 변경되었으므로 바이트 또는 short에 할당 된 숫자 리터럴이 대상 유형으로 자동으로 가정됩니다. 최신 J2ME JVM은 Java 4에서 파생되었습니다.


추신 : J2ME를 코딩하는 중년의 고통에 갇힌 것을 환영합니다. 휴대용 장치가 최대 2000 년 데스크톱을 따라 잡을 때까지 기다릴 수 없습니다.
Lawrence Dol

3
"J4"도없고 "J5"도 없습니다. Java 버전 / 이름 지정 체계를 이미있는 것보다 더 혼란스럽게 만들지 마십시오.
Joachim Sauer

2
@Joachim : Java 1, Java 2, Java 5, Java 6 및 Java 7은 잘 알려져 있으며 참조됩니다. Java 3 및 Java 4가 의미하는 바를 외삽하는 것은 그리 어렵지 않습니다. "Jn"은 단순히 명백한 약어입니다. 모든 버전에 대해 Sun의 현재 (그리고 최종적으로) 명명법을 채택하면 혼란이 줄어 듭니다.
Lawrence Dol

2
@Joachim : 주제에 대한 Sun의 마지막 단어에 따르면 선두 "1." Java "1.x"의 버전은 논의중인 버전을 언급 할 때 전혀없는 것처럼 취급되며 호환성을 위해서만 JVM에서 내 보낸 버전에 유지됩니다. 따라서 Java 2는 J2SE가 원래 나온 곳에서 이전에 1.2로 알려진 버전입니다 (동시에 Sun은 더 이상 J2xE를 사용하지 않고 JavaEE, JavaSE 및 JavaME를 사용하도록 권장 함). 1.3은 Java 3, 1.4는 Java 4, 1.5는 Java 5, 1.6은 Java 6, 1.7은 Java 7입니다. 진지하게, 이것은 추론하기 어렵지 않습니다.
Lawrence Dol

2
"1." 한 단지 자바 5 이후의 절단. Java 1.0-1.4는 항상 Sun에서 해당 이름으로 참조됩니다. Sun은 Java 1.2에서 Java 1.5 / Java 5까지 "Java 2"를 사용했기 때문에 의도적으로 수행되었습니다. 매우 혼란 스럽지만 Sun에서 사용하지 않은 새로운 이름을 발명한다고해서 더 쉽게 만들 수는 없습니다.
Joachim Sauer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.