2010-05-24 4 views
3

У меня есть вопрос по поводу плавающих констант в С.плавающие константы в C

В Java, тип по умолчанию Константы с плавающей точкой в ​​два раза, так что следующее вызывает ошибку компиляции в Java:

float f = 100.0; // we either need to uses type case operator or put f at the end of the number constant. 

Это связано с тем, что константы с плавающей запятой по умолчанию имеют тип double и литье из double в float без оператора литья типа - это ошибка, поэтому нам нужно либо добавить оператор case типа, либо поместить f в конец номера.

Итак, почему в C это не вызывает ошибку, потому что константы с плавающей запятой по умолчанию имеют тип float или потому, что компилятор выполняет неявное преобразование с понижающим преобразованием (которое не требует типа случай оператора в C) ????

ответ

8

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

Если вы хотите константу с плавающей запятой типа float, вы можете добавить суффикс f в конец константы.

4

Неустойчивые константы с плавающей запятой двойные в С. См §6.4.4.2 из the standard:

Вы правы, что это сужает здесь:

§ 6: 3.1.5:

«Когда двойной понижен плавать, длинный двойной понижается в два раза или float, или значение, представляемое в , более высокая точность и дальность, чем , необходимые по его семантическому типу (см. 6.3.1.8), явно преобразуется в его семантический тип, если преобразованное значение может быть представленоточно в новом типе, он не изменился. Если значения преобразуются находится в диапазоне значений, которые могут быть представлены, но не может быть представлены точно, результат является либо ближайшим выше или ближайшим нижним представимо значением, выбираются в от реализации, определяемым способом. Если значение преобразуются находится за пределами диапазона значений, которые могут быть представленными, поведение недеформированных определено. «

§ 6: 5,16:

» Тип выражения присваивания тип левого операнда [...]»

§ 6: 5.16.1:

«В простом присвоении (=), значение правого операнда преобразуется в тип выражения присваивания и заменяет значение, хранящееся в объекта, назначенного левого операнда.»

+0

спасибо за спецификации. –

2

C тихие нисходящие double до float. И, как уже указывалось, литерал с плавающей запятой считается двойным.

В gcc, опция компилятора -Wconversion (не подразумевается в -Wall) выдает предупреждение для этого понижающего приведения (например, в буквальном распайке, как в вашем вопросе).

предупреждение: преобразование «плавать» из «двойной» может изменить свою ценность