C#은 정수 및 부동 소수점 숫자 형식 집합을 제공합니다. 암시적 또는 명시적 두 숫자 형식 간에 변환이 있습니다. 명시적 변환을 수행하려면 캐스트 식을 사용해야 합니다.
암시적 숫자 변환
다음 표에서는 기본 제공 숫자 형식 간의 미리 정의된 암시적 변환을 보여 줍니다.
| 부터 | 에게 |
|---|---|
| sbyte |
short, int, long, float, double, decimal또는 nint |
| 바이트 |
short, ushort,int, uint, long, ulong, float, doubledecimal, nint또는nuint |
| 짧은 |
int, long, float, double또는 , 또는 decimalnint |
| ushort |
int, uint, long, ulong, float, double또는 decimal, nint또는 nuint |
| int |
long, float, double또는 decimal, nint |
| uint |
long, ulong, float, double또는 , 또는 decimalnuint |
| 길다 |
float, double 또는 decimal |
| ulong |
float, double 또는 decimal |
| 플로트 | double |
| nint |
long, float, double또는 decimal |
| nuint |
ulong, float, double또는 decimal |
비고
에서 암시적 변환int, , long, ulongnint, 또는 nuintfloat , 또는 ulongdoublelongnuintnint전체 자릿수의 손실을 일으킬 수 있지만 크기의 순서는 손실되지 않습니다. uint 다른 암시적 숫자 변환 시에는 정보 손실이 없습니다.
또한 주의해야 할 사항
모든 정수 계열 숫자 형식 은 암시적으로 부동 소수점 숫자 형식으로 변환할 수 있습니다.
및
sbyte형식에 대한 암시적 변환은byte없습니다. 및decimal형식에서의 암시적 변환은double없습니다.형식과 형식 간에
decimal암시적 변환이floatdouble없습니다.형식
int의 상수 식 값(예: 정수 리터럴로 표현되는 값)은 대상 형식의 범위 내에 있는 경우 암시적으로 ,uintshortushortbyte,,ulongnint또는nuint,로 변환sbyte할 수 있습니다.byte a = 13; byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'앞의 예제와 같이 상수 값이 대상 형식의 범위 내에 있지 않으면 컴파일러 오류 CS0031 이 발생합니다.
명시적 숫자 변환
다음 표에서는 암시적 변환이 없는 기본 제공 숫자 형식 간의 미리 정의된 명시 적 변환을 보여 줍니다.
| 부터 | 에게 |
|---|---|
| sbyte |
byte, ushort, uint, ulong 또는 nuint |
| 바이트 | sbyte |
| 짧은 |
sbyte, byte, , ushortuint, ulong, 또는nuint |
| ushort |
sbyte, byte 또는 short |
| int |
sbyte, byte, short, ushort, uint, ulong또는 nuint |
| uint |
sbyte, byte, , shortushort, int, 또는nint |
| 길다 |
sbyte, byte, short, , intushort, uint, ulong, nint또는nuint |
| ulong |
sbyte, byte, short, , intushort, uint, long, nint또는nuint |
| 플로트 |
sbyte, byte,short, ushort, int, uint, long, ulongdecimal, nint또는nuint |
| 더블 |
sbyte, byte, short, ushort, int, uint, long, ulongfloat, decimal, nint또는nuint |
| 십진수 |
sbyte, byte, short, ushort, int, uint, long, ulongfloat, double, nint또는nuint |
| nint |
sbyte, byte,short, , intushort, uint, ulong또는nuint |
| nuint |
sbyte, byte,short, , intushort, uint, long또는nint |
비고
명시적 숫자 변환으로 인해 데이터가 손실되거나 예외가 throw될 수 있습니다(일반적으로 .) OverflowException.
또한 다음 사항에 유의하세요.
정수 계열 형식의 값을 다른 정수 형식으로 변환하는 경우 결과는 오버플로 검사 컨텍스트에 따라 달라집니다. 확인된 컨텍스트에서 원본 값이 대상 형식 범위 내에 있으면 변환에 성공합니다. 그렇지 않으면 OverflowException가 던져집니다. 선택되지 않은 컨텍스트에서 변환은 항상 성공하며 다음과 같이 진행됩니다.
원본 형식이 대상 형식보다 큰 경우 가장 중요한 "추가" 비트를 삭제하여 원본 값이 잘립니다. 그런 다음, 결과는 대상 형식의 값으로 처리됩니다.
원본 형식이 대상 형식보다 작은 경우 원본 값은 대상 형식과 크기가 같도록 기호 확장 또는 0 확장입니다. 원본 형식이 서명된 경우 서명 확장이 사용됩니다. 원본 형식이 서명되지 않은 경우 0 확장이 사용됩니다. 그런 다음, 결과는 대상 형식의 값으로 처리됩니다.
원본 형식이 대상 형식과 크기가 같으면 원본 값이 대상 형식의 값으로 처리됩니다.
값을 정수 형식으로
decimal변환하면 이 값이 0으로 반올림되어 가장 가까운 정수 값으로 반올림됩니다. 결과 정수 값이 대상 형식의 범위를 벗어나면 throw OverflowException 됩니다.값
double또는float값을 정수 형식으로 변환하면 이 값이 0으로 반올림되어 가장 가까운 정수 값으로 반올림됩니다. 결과 정수 값이 대상 형식의 범위를 벗어나면 결과는 오버플로 검사 컨텍스트에 따라 달라집니다. 확인된 컨텍스트에서 throw OverflowException 되는 반면, 선택되지 않은 컨텍스트에서는 결과가 대상 형식의 지정되지 않은 값입니다.변환
double할float때 값은double가장float가까운 값으로 반올림됩니다. 값이double너무 작거나 너무 커서 형식에float맞지 않으면 결과는 0 또는 무한대입니다.변환하거나 변환
float할decimal때 원본 값은 표현으로decimal변환되고 필요한 경우 28번째 소수점 이후 가장 가까운 숫자double로 반올림됩니다. 원본 값의 값에 따라 다음 결과 중 하나가 발생할 수 있습니다.원본 값이 너무 작아서 0이
decimal되면 결과가 0이 됩니다.원본 값이 NaN(숫자가 아님), 무한대 또는 너무 커서 표시
decimal할 수 없는 경우 throw OverflowException 됩니다.
변환하거나 변환
decimal할float때 원본 값은 각각 가장float가까운 값 또는double값double으로 반올림됩니다.
C# 언어 사양
자세한 내용은 C# 언어 사양의 다음 섹션을 참조하세요.
참고하십시오
.NET