รวบรวมรหัสต่อไปนี้:
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
ในเอกสารไมโครซอฟท์มีการกล่าวถึงการลงนามจำนวนเต็มค่าสูงสุดในการแปลงจากไม่มีการdouble
unsigned int
ค่าทั้งหมดข้างต้นINT_MAX
จะถูกตัดทอน2147483648
เมื่อเป็นการกลับมาของฟังก์ชัน
ฉันใช้Visual Studio 2019เพื่อสร้างโปรแกรม นี้ไม่ได้เกิดขึ้นในGCC
ฉันทำอะไรผิดหรือเปล่า? มีวิธีที่ปลอดภัยในการแปลงdouble
ไปunsigned int
?