Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Konwersja "konwersja" z "type1" na "type2", możliwa utrata danych
Typ liczby całkowitej jest konwertowany na mniejszy typ całkowity.
- Jest to ostrzeżenie poziomu 4, jeśli typ1 jest podpisany lub niepodpisany
int
, a typ2 jest mniejszy, taki jak podpisany lub niepodpisanyshort
. - Jest to ostrzeżenie poziomu 3, jeśli wartość typu
__int64
lubunsigned __int64
jest przypisana do podpisanego lub niepodpisanegoint
. Mogła wystąpić możliwa utrata danych z powodu konwersji zawężającej, co może prowadzić do nieoczekiwanych wyników.
Aby naprawić to ostrzeżenie, zmień program tak, aby używał zgodnych typów lub dodaj logikę, która gwarantuje, że zakres możliwych wartości jest zgodny z używanymi typami. Jeśli konwersja jest przeznaczona, użyj jawnego rzutowania, aby wyciszyć ostrzeżenie.
C4244 może również pojawić się, gdy poziom ostrzeżenia wynosi 2. Aby uzyskać więcej informacji, zobacz Ostrzeżenie kompilatora (poziom 2) C4244.
Poniższy przykład generuje 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
}
Aby uzyskać więcej informacji, zobacz Zwykłe konwersje arytmetyczne.
Aby uzyskać więcej informacji na temat ustawiania poziomu ostrzeżenia w programie Visual Studio, zobacz Aby ustawić opcje kompilatora w środowisku projektowym programu 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
}
Ostrzeżenie C4244 może wystąpić podczas kompilowania kodu dla obiektów docelowych 64-bitowych, które nie generują ostrzeżenia podczas kompilowania dla obiektów docelowych 32-bitowych. Na przykład arytmetyka wskaźnika skutkuje ilością 32-bitową na platformach 32-bitowych, ale 64-bitową ilością na platformach 64-bitowych.
Poniższy przykład generuje kod C4244 podczas kompilacji dla obiektów docelowych 64-bitowych:
// C4244_level3_b.cpp
// compile with: /W3
int main() {
char* p1 = 0;
char* p2 = 0;
int x = p2 - p1; // C4244
}