왜 int i = 2147483647 + 1;
OK이지만 byte b = 127 + 1;
컴파일 할 수 없습니까?
답변
상수는 int로 평가되므로 2147483647 + 1
오버플로가 발생하고 새로운 int를 제공합니다.이 속성은으로 지정할 수 int
있지만 127 + 1
으로 int
같 128
으며에 할당 할 수 없습니다 byte
.
답변
리터럴 (127)은 int 유형의 값을 나타낸다. 리터럴 1도 마찬가지입니다.이 둘의 합은 정수 128입니다. 두 번째 경우 문제는 이것을 바이트 유형의 변수에 할당한다는 것입니다. 실제 표현식 값과는 아무런 관련이 없습니다. 강제 (*)를 지원하지 않는 Java와 관련이 있습니다. 타입 캐스트를 추가해야합니다
byte b = (byte)(127 + 1);
그런 다음 컴파일됩니다.
(*) 적어도 String-to-integer, float-to-Time 종류가 아닙니다. Java는 어떤 의미에서 손실이없는 경우 강제를 지원합니다 (Java는 이것을 “확장”이라고합니다).
그리고 “강제”라는 단어는 바로 잡을 필요가 없었습니다. 그것은 매우 신중하고 정확하게 선택되었습니다. 가장 가까운 소스에서 직접 (Wikipedia) : “대부분의 언어에서 강제 변환은 컴파일 또는 런타임 중에 암시 적 변환 을 나타내는 데 사용됩니다 .” 및 “컴퓨터 과학, 형식 변환, 타입 캐스팅 및 강압에있는 다른 다른에 하나 개의 데이터 유형의 엔티티를 변경 암묵적으로 또는 명시 적으로하는 방법은.”.
답변
@MByD의 증거로 :
다음 코드는 컴파일됩니다.
byte c = (byte)(127 + 1);
expression (127 + 1)
이 int이고 scope off byte
유형을 벗어나 더라도 결과는로 캐스트됩니다 byte
. 이 표현식은을 생성합니다 -128
.
답변
JLS3 # 5.2 할당 변환
(변수 = 표현식)
또한 표현식이 byte, short, char 또는 int 유형의 상수 표현식 (§15.28) 인 경우 :
변수의 유형이 바이트, 짧은 또는 문자이고 상수 표현식의 값이 변수의 유형으로 표현 가능한 경우 축소 기본 변환이 사용될 수 있습니다.
이 절이 없으면 글을 쓸 수 없습니다
byte x = 0;
char c = 0;
그러나 우리가 이것을 할 수 있을까요? 나는 그렇게 생각하지 않습니다. 프리미티브 사이의 변환에는 꽤 많은 마술이 진행되고 있으므로 매우 신중해야합니다. 나는 글을 쓰지 않을 것이다
byte x = (byte)0;