编译器警告(等级 3 和 4)C4244
从“type1”到“type2”的“conversion”转换,可能丢失数据
整数类型转换为更小的整数类型。
- 如果 type1 是有符号或无符号的
int
且 type2 较小(例如有符号或无符号的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 可能在为 64 位目标构建代码时出现,而在为 32 位目标构建时则不会生成此警告。 例如,指针算术在 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
}