Biên dịch mã sau:
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;
}
Đầu ra (MSVC x86):
INT_MAX: 2147483647
UINT_MAX: 4294967295
Double value: 2147483649.000000
Direct cast value: 2147483648
Indirect cast value: 2147483649
Đầu ra (MSVC x64):
INT_MAX: 2147483647
UINT_MAX: 4294967295
Double value: 2147483649.000000
Direct cast value: 2147483649
Indirect cast value: 2147483649
Trong tài liệu của Microsoft không đề cập đến giá trị tối đa của số nguyên có dấu trong các chuyển đổi từ double
sang unsigned int
.
Tất cả các giá trị trên INT_MAX
đang bị cắt bớt 2147483648
khi nó là giá trị trả về của một hàm.
Tôi đang sử dụng Visual Studio 2019 để xây dựng chương trình. Điều này không xảy ra trên gcc .
Tôi có đang làm sai không? Có cách nào an toàn để chuyển đổi double
sang unsigned int
không?