컴파일러 경고(수준 3 및 4) C4244
'conversion': 'type1'에서 'type2'(으)로 변환하면서 데이터가 손실될 수 있습니다.
정수 형식은 더 작은 정수 형식으로 변환됩니다.
- type1이 부호 있거나 서명되지 않은 경우, type2가 부호 있거나 서명
int
되지 않은short
것과 같이 더 작은 경우 수준 4 경고입니다. - 형식
__int64
unsigned __int64
값이 부호 있거나 서명int
되지 않은 값에 할당된 경우 수준 3 경고입니다. 축소 변환으로 인해 데이터가 손실될 수 있으며 이로 인해 예기치 않은 결과가 발생할 수 있습니다.
이 경고를 해결하려면 호환되는 형식을 사용하도록 프로그램을 변경하거나 가능한 값 범위가 사용 중인 형식과 호환되도록 하는 논리를 추가합니다. 변환이 의도된 경우 명시적 캐스트를 사용하여 경고를 무음으로 표시합니다.
경고 수준이 2일 때 C4244도 나타날 수 있습니다. 자세한 내용은 컴파일러 경고(수준 2) C4244를 참조하세요.
다음 샘플에서는 C4244 오류가 발생하는 경우를 보여 줍니다.
// C4244_level4.cpp
// compile with: /W4
void test(unsigned short num) {}
int main() {
int int1 = 1;
unsigned int uint1 = 2;
short short1 = int1; // C4244
short short2 = (short)int1; // warning silenced - explicit cast
short short3 = uint1; // C4244
unsigned short ushort = uint1; // C4244
test(uint1); // C4244
}
자세한 내용은 일반적인 산술 변환을 참조 하세요.
Visual Studio에서 경고 수준을 설정하는 방법에 대한 자세한 내용은 Visual Studio 개발 환경에서 컴파일러 옵션을 설정하려면
// C4244_level3.cpp
// compile with: /W3
int main() {
__int64 i64 = 1;
unsigned __int64 u64 = 2;
int int1 = i64; // C4244
int int3 = u64; // C4244
}
경고 C4244는 32비트 대상을 빌드할 때 경고를 생성하지 않는 64비트 대상에 대한 코드를 작성할 때 발생할 수 있습니다. 예를 들어 포인터 산술 연산은 32비트 플랫폼에서 32비트 수량을 생성하지만 64비트 플랫폼에서는 64비트 수량을 생성합니다.
다음 샘플에서는 64비트 대상에 대해 컴파일하는 경우 C4244 오류가 발생합니다.
// C4244_level3_b.cpp
// compile with: /W3
int main() {
char* p1 = 0;
char* p2 = 0;
int x = p2 - p1; // C4244
}