В C, код как
unsigned long long b = *(unsigned long long *) &a;
недопустимо, поскольку нарушает правило, называемое строгим псевдонимом, для указателей одного типа, ссылающихся на объекты другого типа.
Однако есть исключение: указатель на символ может иметь псевдоним любого объекта
Таким образом, используя указатель на символ, вы можете сделать что-то подобное в C:
#include <stdio.h>
int main()
{
double a = 4.75;
unsigned char* p;
// Method 1 - direct memory read
p = (unsigned char*)&a;
for (size_t i=0; i < sizeof(double); ++i)
{
printf("%02x ", *p);
++p;
}
printf("\n");
// Method 2 - reversed memory read
size_t i = sizeof(double);
p = (unsigned char*)&a + i - 1;
do
{
printf("%02x ", *p);
--p;
--i;
} while(i > 0);
return 0;
}
Выход:
00 00 00 00 00 00 13 40
40 13 00 00 00 00 00 00
Два метода печатаются с разным порядком байтов.
Если вам не нравятся указатели, вы можете в качестве альтернативы использовать союз. Как:
#include <stdio.h>
int main()
{
union
{
double a;
char c[sizeof(double)];
} d;
d.a = 4.75;
for (size_t i=0; i < sizeof(double); ++i)
{
printf("%02x ", d.c[i]);
}
printf("\n");
size_t i = sizeof(double);
do
{
--i;
printf("%02x ", d.c[i]);
}
while (i > 0);
printf("\n");
return 0;
}
Выход:
00 00 00 00 00 00 13 40
40 13 00 00 00 00 00 00