следуя ответу @ caf, вы можете использовать union
:
#define F2L(x) ((union{float f;unsigned long l;})(x)).l
int main(int argc, char *argv[])
{
unsigned long array[] = {F2L(1.0f),F2L(2.0f),F2L(3.0f)};
printf("%x %x %x\n",array[0],array[1],array[2]);
printf("%x\n",array[1] - array[0]);
system("PAUSE");
return 0;
}
это печатает (под GCC 3.4.5, старый, я знаю :(, но это все, что у меня есть, где я нахожусь, используя -O3):
3f800000 40000000 40400000
800000
и сгенерированный asm подтверждает, что рассматривает их как unsigned long
s:
CPU Disasm
Address Hex dump Command Comments
004012A8 |. C745 E8 00008 MOV DWORD PTR SS:[LOCAL.6],3F800000
004012AF |. B9 0000803F MOV ECX,3F800000
004012B4 |. BA 00004040 MOV EDX,40400000
004012B9 |. 894C24 04 MOV DWORD PTR SS:[LOCAL.13],ECX ; /<%x> => 3F800000
004012BD |. B8 00000040 MOV EAX,40000000 ; |
004012C2 |. 895424 0C MOV DWORD PTR SS:[LOCAL.11],EDX ; |<%x> => 40400000
004012C6 |. C745 EC 00000 MOV DWORD PTR SS:[LOCAL.5],40000000 ; |
004012CD |. C745 F0 00004 MOV DWORD PTR SS:[LOCAL.4],40400000 ; |
004012D4 |. 894424 08 MOV DWORD PTR SS:[LOCAL.12],EAX ; |<%x> => 40000000
004012D8 |. C70424 003040 MOV DWORD PTR SS:[LOCAL.14],OFFSET 00403 ; |format => "%x %x %x
"
004012DF |. E8 6C050000 CALL <JMP.&msvcrt.printf> ; \MSVCRT.printf
004012E4 |. C70424 0A3040 MOV DWORD PTR SS:[LOCAL.14],OFFSET 00403 ; /format => "%x
"
004012EB |. 8B55 E8 MOV EDX,DWORD PTR SS:[LOCAL.6] ; |
004012EE |. 8B45 EC MOV EAX,DWORD PTR SS:[LOCAL.5] ; |
004012F1 |. 29D0 SUB EAX,EDX ; |
004012F3 |. 894424 04 MOV DWORD PTR SS:[LOCAL.13],EAX ; |<%x> => 800000
004012F7 |. E8 54050000 CALL <JMP.&msvcrt.printf> ; \MSVCRT.printf