다음을 통해 공유


컴파일러 경고(수준 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
}