Почему следующий код возвращает ноль при компиляции с помощью clang?
#include <stdint.h>
uint64_t square() {
return ((uint32_t)((double)4294967296.0)) - 10;
}
Сборка, которую он производит:
push rbp
mov rbp, rsp
xor eax, eax
pop rbp
ret
Я бы ожидал, что double станет равным нулю ( целое число) и этот минус обернул бы его вокруг. Другими словами, почему не важно, какое число нужно вычесть, так как оно всегда дает ноль? Обратите внимание, что g cc производит разные числа, как и ожидалось:
push rbp
mov rbp, rsp
mov eax, 4294967285
pop rbp
ret
Я предполагаю, что приведение от 4294967296.0 к uint32_t
- это неопределенное поведение, но даже в этом случае я ожидаю получить разные результаты для разных вычитаемых.