Вопрос

Учитывая следующий код ANSI C, я задаюсь вопросом о результатах:

main() {
  int a = 19.4 / 9.7;               // result = 2
  float b = (int) 19.4 / (int) 9.7  // result = 2.000000, why?
  float c = (int) 9.7;              // result = 9
}

Я понял, что C отрежет все десятичные места на конверсии в Int, но у моей логики есть недостаток, если я увижу вторую строку. Если десятичные места были вырезаны, результат должен быть 2.11111.

Как проводится преобразование с плавающей запятой в ANSI C?

Это было полезно?

Решение

В стандарте C, такие как 19,4 и 9,7, считаются вдвое больше, если вы не указаете иное (например, 19.4f, 9.7f).

Компилятор будет использовать либо функцию целочисленного деления для вычисления x / y (если как x, так и y имеют тип int (совместимый)), либо функцию деления плавающей запятой на компьютер x / y, если по крайней мере один из x и y - плавающая точка тип.

float b = (int) 19.4 / (int) 9,7 // Результат = 2,000000, почему?

Вы просите, чтобы 19.4 был отменен в Int, а 9,7 - в Int, эффективно прося компилятора вычислять целочисленное разделение 19/9 = 2, которое затем способствует плавать для хранения в б. 2 становится 2,0.

.Pmcd.

Другие советы

В строке 2 вы преобразуете входные значения в целые числа, а затем выполняете целочисленное разделение (поскольку оба операнда для разделения являются INTS, разделение выполняется в целочисленном пространстве, что означает, что любой фракционный резит будет усечен).

Итак, 19/9 = 2

Затем, чтобы получить это целое число в поплавок, он неявно преобразует 2 обратно в 2.000000

Нет, это должно быть 2. Когда вы делите Int на int, вы получаете Int. Таким образом, 2. Вы можете сделать Hokey-Pokey впоследствии преобразовать его в все, что вам нравится, но десятичные десятички уже исчезли.

Разделите два целых числа, и вы получите целое число. Разделите поплавок и целое число, и вы получите поплавок.

(int) 19.4 / (int) 9.7 эквивалентно 19 / 9, который сначала разрешается в 2 (int). Только после того, как 2 рассчитывается, он превращается в поплавок по типу переменной.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top