Это очень странная вещь; числа с плавающей запятой - , а не, хранящиеся в качестве дополнения 2s, поэтому это не имеет большого смысла.
Во всяком случае, возможно, вы можете использовать старый добрый union
трюк:
union {
float real;
unsigned long integer;
} tmp = { 564.48 };
tmp.integer = ~tmp.integer + 1;
printf("I got %f\n", tmp.real);
Когда я попробовал (на ideone) он напечатал:
I got -0.007412
Обратите внимание, что это зависит от неустановленного поведения , поэтому возможно, что он может сломаться, если ваш компилятор не реализует доступ самым прямым способом. Это отличная форма undefined поведение (что сделало бы код недействительным), но все же не оптимальным. Кто-то сказал мне, что более новые стандарты делают это яснее, но я не нашел точной ссылки, поэтому ... подумайте о себе, предупредив вас.
'564.48'' '' double', литье в 'unsigned long' усекает его до' 564'. Что вы ожидаете? –
Значение memcpy float для unsigned long, а затем примените компонент two. Или используйте union с float и unsigned long, назначьте 564.48f для float и примените компонент two к unsigned long. –
@AlexFarber: Все они будут отображаться UB. – bitmask