Правильный тип данных для переменной

#c

#c

Вопрос:

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

 a = 23.5

a) float
b) double
c) long double
d) None
  

По моему мнению, он должен быть двойным. Потому что, если мы

  float a = 23.5
  

Тогда, фактически, мы инициализируем переменную с плавающей точкой двойной константой. Правильно ли я говорю, что это вариант b?

Комментарии:

1. Преобразование было бы разрешено во время компиляции. Может быть использован любой из вариантов (a), (b) или (c). Использование опции (b) является разумным выбором с предоставлением минимальной информации.

2. Точно. Я также выбрал вариант (b). Однако ответом был вариант (a), я предполагаю, что ответ может быть неправильным.

3. «Правильный» ответ был (a) ? Теперь это просто глупо.

Ответ №1:

Это зависит от того, какой тип вам нужен для a того, чтобы быть в логике вашей программы, а не от того, какой тип значения он инициализирован.

Да, float a = 23.5; происходит преобразование double литерала 23.5 в float переменную a , но это нормально. Например, чтобы инициализировать double переменную на 42.0 , люди обычно используют

 double a = 42;
  

в котором 42 имеет тип int , вместо более длинного

 double a = 42.0;
  

Итак, на мой взгляд, float , double или long double здесь все можно считать правильными.

Комментарии:

1. Кроме того, у меня есть сомнения. Если я объявлю переменную как, float a = 2.2 . Затем, по сути, я инициализирую переменную с плавающей точкой с помощью double. Теперь, если я печатаю с помощью printf("%f",a) , то перед печатью значение с плавающей точкой обновляется до двойного, верно? Итак, в основном преобразование происходит в два этапа. При объявлении значение double преобразуется в значение с плавающей точкой, а затем перед печатью оно снова обновляется до double?

2. ДА . Второй шаг выполняется, только если вы печатаете f (или аналогичные переменные функции).

3. Хорошо. Понял. Я действительно ценю, что все вы помогаете мне. Большое спасибо. 🙂

Ответ №2:

Вы можете объявить эту переменную как double, float или long double.

Разница заключается в диапазоне типа.

Например (один из возможных способов):

 float- 4 bytes
double - 8 bytes
long double - 12 bytes
  

Вы можете увидеть более подробную информацию здесь: http://www.lix.polytechnique.fr /~liberti/public/computing/prog/c/C/CONCEPT/data_types.html

Комментарии:

1. Обратите внимание, что есть платформы, где sizeof(double) == sizeof(long double) и другие, где sizeof(long double) == 16 .

2. Да, как я уже сказал, это был пример возможных значений этого типа. Я отредактировал ответ, чтобы прояснить этот факт.

3. Но я предполагаю, что ответ может быть float, потому что, учитывая число, которое они указали, то есть 23.5, оно должно храниться в переменной, занимающей минимальное пространство.

4. Если вы хотите сохранить эту переменную на минимальном пространстве, то ответом должно быть значение so float. Обратите внимание, что вы можете объявить этот var также в других типах, и это просто займет (немного) больше памяти.

Ответ №3:

«Это зависит от» — это правильный ответ.

Есть больше вариантов, чем те три, которые вы упомянули.

  • Если вы можете с уверенностью предположить, что ваши числа являются либо целым числом, либо целым числом 1/2, то сохранение 2 * i в целочисленном типе может быть правильным выбором.
  • Другой вариант — рациональное число. Для этого существуют библиотеки.