암시적 변환 - 사용자가 요구하지 않더라도 컴파일러가 알아서 적당한 타입으로 바꿔주는 것
                 - 서로 호환되는 타입끼리 연산할 때나 논리적으로 안전에 별 문제가 없을 때에 자동으로 변환

예)
int a = 3;
int b = a;

양쪽의 타입이 일치하여 아무론 문제가 없는 경우



예)

short s = 1234;
int i = s;

short 타입으로 표현할 수 있는 모든 값을 int 타입으로도 표현 가능하다
short는 -32768~32767, int는 -20억~20억 이므로 무난히 대입된다




* 작은타입을 큰 타입에 대입할때는 항상 안전하고, 변환 지정을 거치지 않아도 된다
* 대입가능
byte -> short
int -> long
float -> double
char -> ushort


----------------------------------------------------------------------------------

예) 큰 타입을 작은 타입에 대입하는 경우

int i = 12345678;
short s = i;

에러가 난다


예) 크기는 같은데 부호 여부만 다른 경우
* int 와 uint는 둘다 32비트이고 부호여부만 다르다

int i = -1;
uint u = i;

uint u = 299999999;
int i = u;



* 크기가 같아도 부호 여부가 틀려 100% 안전하지 못하고 컴파일러도 암시적 변환을 하지 않는다
* 다음사항도 마찬가지
byte -> sbyte
short -> ushort
long -> ulong


예) 부호여부가 다르지만 암시적 변환이 허용되는 경우

ushort us = 32000;
int i = us;

ushort 는 부호가 없는 16비트, int는 부호가 있는 32비트 int는 ushort가 표현하는 모든값 저장가능하므로 암시적 변환 가능
*다음사항도 마찬가지
byte -> short
uint -> long


예) 부호여부가 다르지만 암시적 변환이 허용되지 않는 경우
short s = -1234;
uint u = s;
* 크기는 더 크지만 부호를 표현할 수 없기 때문에 음수를 표현할수 있는 short의 값을 받을수 없다

----------------------------------------------------------------------------------

double d = 3.14;
int i = d;
* 정수는 소수점을 기억할수 없으므로 에러가 난다

int i = 123456789;
double d = i;
* double은 정수, 소수 기억가능하므로 정수 대입이 가능하다

----------------------------------------------------------------------------------

int i = 1,j;
short s = 2;
j = i + s;
* int와 short를 더해 int에 대입했는데 i+s에서 s는 int가 된다

short a = 1, b = 2, c;
c = a + b;
* short끼리 더한 결과가 short의 범위를 넘을 수도 있으므로 c는 반드시 int로 선언해야 한다

short a = 1, b = 2, c;
c = (short)(a+b);
* 아니면 결과를 short로 캐스팅을 한다

Posted by 코딩하는 야구쟁이
,