짧은 C #에 설명 된대로 (하지만 Java와 같은 다른 언어 컴파일러에도 해당)
short에서 int, long, float, double 또는 decimal로 미리 정의 된 암시 적 변환이 있습니다.
더 큰 스토리지 크기의 비 리터럴 숫자 유형을 short로 암시 적으로 변환 할 수 없습니다 (정수 유형의 스토리지 크기는 Integral Types Table 참조). 예를 들어 다음 두 개의 짧은 변수 x 및 y를 고려하십시오.
short x = 5, y = 12;
다음 할당 문은 할당 연산자의 오른쪽에있는 산술 표현식이 기본적으로 int로 평가되기 때문에 컴파일 오류가 발생합니다 .
short z = x + y;
이 문제를 해결하려면 캐스트를 사용하십시오.
short z = (short)(x + y);
그러나 대상 변수의 저장소 크기가 같거나 저장소 크기가 더 큰 다음 문을 사용할 수 있습니다.
int m = x + y;
long n = x + y;
좋은 후속 질문은 다음과 같습니다.
"대입 연산자의 오른쪽에있는 산술 표현식이 기본적으로 int로 평가되는 이유"?
첫 번째 답변은 다음에서 찾을 수 있습니다.
정수 상수 폴딩 분류 및 공식 검증
산술 표현식이 평가되어야 정수 자바 언어 사양을 정의는 정수 번호는 어떻게 표현하고 정확하게하는 방법 . 이 프로그래밍 언어는 인터넷의 분산 응용 프로그램에서 사용되도록 설계 되었기 때문에 Java의 중요한 속성입니다. Java 프로그램은이를 실행하는 대상 기계와 독립적으로 동일한 결과를 생성하는 데 필요합니다 .
반대로 C (및 널리 사용되는 명령형 및 객체 지향 프로그래밍 언어의 대부분)는 더 조잡하고 많은 중요한 특성을 열어 둡니다. 이 부정확 한 언어 사양의 의도는 분명합니다. 동일한 C 프로그램은 대상 프로세서에 내장 된 산술 연산을 사용하여 소스 프로그램의 정수 산술을 인스턴스화하여 16 비트, 32 비트 또는 64 비트 아키텍처에서 실행되어야합니다. 이는 사용 가능한 기계 작업을 직접 사용할 수 있기 때문에 훨씬 더 효율적인 코드로 이어집니다. 정수 계산이 "충분히 작은"숫자만을 처리하는 한, 불일치는 발생하지 않습니다.
이러한 의미에서 C 정수 산술은 프로그래밍 언어 사양에 의해 정확하게 정의되지 않고 대상 시스템을 결정함으로써 만 완전히 인스턴스화되는 자리 표시 자입니다.
Java는 정수가 표현되는 방법과 정수 산술이 계산되는 방법을 정확하게 정의합니다.
Java Integers
--------------------------
Signed | Unsigned
--------------------------
long (64-bit) |
int (32-bit) |
short (16-bit) | char (16-bit)
byte (8-bit) |
Char는 유일한 부호없는 정수 유형입니다. 그 값은 유니 코드 문자를 나타냅니다. from \u0000
~ \uffff
, 즉 0 ~ 2 16 -1.
정수 연산자에 long 유형의 피연산자가 있으면 다른 피연산자도 long 유형으로 변환됩니다. 그렇지 않으면 연산이 int 유형의 피연산자에 대해 수행되고 필요한 경우 더 짧은 피연산자가 int로 변환됩니다 . 변환 규칙이 정확하게 지정됩니다.
[이론 컴퓨터 과학의 전자 노트 82 No. 2 (2003)
Blesner-Blech-COCV 2003 : Sabine GLESNER , Jan Olaf BLECH,
Fakultät für Informatik,
Universität Karlsruhe
Karlsruhe, Germany]
T a, b; a += b
과 동일합니다T a, b; a = (T) (a + b)
. 컴파일러가 추가 한 캐스트를 확인하십시오.