次のコードをコンパイルします。
double getDouble()
{
double value = 2147483649.0;
return value;
}
int main()
{
printf("INT_MAX: %u\n", INT_MAX);
printf("UINT_MAX: %u\n", UINT_MAX);
printf("Double value: %f\n", getDouble());
printf("Direct cast value: %u\n", (unsigned int) getDouble());
double d = getDouble();
printf("Indirect cast value: %u\n", (unsigned int) d);
return 0;
}
出力(MSVC x86):
INT_MAX: 2147483647
UINT_MAX: 4294967295
Double value: 2147483649.000000
Direct cast value: 2147483648
Indirect cast value: 2147483649
出力(MSVC x64):
INT_MAX: 2147483647
UINT_MAX: 4294967295
Double value: 2147483649.000000
Direct cast value: 2147483649
Indirect cast value: 2147483649
ではMicrosoftのドキュメントからの変換に最大値符号付き整数には言及がないdouble
のはunsigned int
。
上記のすべての値は、関数が返さINT_MAX
れる2147483648
ときに切り捨てられます。
Visual Studio2019を使用してプログラムをビルドしています。これはgccでは発生しません。
私は何か間違ったことをしていますか?変換する安全な方法があるdouble
のではunsigned int
?