Quote:
Originariamente inviato da fano
avevamo scritto:
fadd qword[__ulong2double_const4]
ma __ulong2double_const4 era in realtà un intero a 32 bit (un double word come piace chiamarlo ad Intel  ) quindi NASM faceva un cast maldestro facendolo diventare:
00 00 00 00 5F 80 00 00
ma poi solo i primi 4 byte erano in qualche modo sommati? Quindi un'addizione con 0x00000?
|
Semplice: 0x5F800000 è la rappresentazione binaria di 18446744073709551616 in formato floating-point
32 bit, mentre 0x000000005F800000
non è la rappresentazione binaria di 18446744073709551616 in formato floating-point
64 bit.
Esempio:
Codice:
unsigned int val1 = 0x5F800000UL;
unsigned long long val2 = 0x000000005F800000ULL;
unsigned long long val3 = 0x43F0000000000000ULL;
printf("%f\n%f\n%f\n", *(float *)&val1, *(double *)&val2, *(double *)&val3);
Codice:
18446744073709551616.000000
0.000000
18446744073709551616.000000