negacja liczby ruchomej w c nie udaje się w niektórych przypadkach

Napisałem funkcję, która działa w setkach przypadków, ale w niektórych przypadkach kończy się niepowodzeniem.

Oto funkcja C:

unsigned negate_number(unsigned x) {
  int sign = (!(x & 0x80000000))<<31;
  int other = 0x7FFFFFFF & x;
  return (sign | other);
}

Po prostu maskuję znak, odwracam go i wykonuję OR (łączenie) z maskowanym wykładnikiem i mantessą. To powinno działać we wszystkich przypadkach.

Ale tutaj jest przypadek, w którym nie powiedzie się: x = 0x7fc00000 (2143289344)

questionAnswers(1)

yourAnswerToTheQuestion