#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 в целочисленном типе может быть правильным выбором.
- Другой вариант — рациональное число. Для этого существуют библиотеки.