2013-12-12 6 views
0

Является ли формат и размер поплавка или двойной по всем основным системам разработки (Windows, Linux и Mac) одинаковым?float и double на разных платформах

Есть ли способ убедиться, что они совместимы друг с другом? Например, я могу убедиться, что int 32 бит, используя int32_t как тип вместо int, но есть ли подобная техника для float и double? не

ответ

1

Нет нет:

1) Формат: зависит от байтов вашей архитектуры.

2) размер: double должен быть не меньше, чем float. Любое другое допустимо.

см стандарт C:

§6.2.5.10

Есть три типа реального эт, с плавающей обозначаемые как поплавок, двойной и длинный двойной. Набор значений типа float представляет собой подмножество набора значений типа double: ; набор значений типа double является подмножеством набора значений типа long double.

Смотрите также Any guaranteed minimum sizes for types in C?

+0

Существуют также ограничения, связанные с минимальными диапазонами и точностью. И endianness не влияет на формат; он вступает в игру, когда вы пытаетесь получить доступ к переменной как массив байтов (и практически никогда не было никаких причин для этого). –

+0

@James Kanze: это хорошее разъяснение, но я принял формат, чтобы * означать * порядок байтов. Возможно, OP означало организацию мантиссы/экспоненты, как я думаю, вы делаете. – Bathsheba

+0

На самом деле вполне возможно, что OP означало размещение байтов. В этом случае следует отметить, что это неотъемлемая часть формата, так как все машины, которые я знаю сегодня, используют 'float' и' double' как «слова», а не как последовательность байтов. –

0

Это зависит от того, что вы имеете в виду под «основными системами развития». Windows и большинство систем Unix используют IEEE float и double, поэтому они будут использовать тот же формат. Большинство мэйнфреймов (включая IBM) используют в другом формате.

Реальный вопрос, почему вам нужна совместимость. Если вы беспокоитесь о переносимости, вы не используетеint32_t, потому что есть еще некоторые платформы, которые его не поддерживают. Более , во всех случаях, кроме исключительных, вы должны использовать int и проверять ввод с помощью выражений с использованием INT_MAX и INT_MIN, чтобы предотвратить переполнение.

+0

Ни Windows, ни Unix, ни любая другая операционная система не определяет способ хранения типов данных. Это аспекты компилятора (для определения ширины) и ЦП (для определения макета), а иногда и процессор и компилятор (для архитектур, поддерживающих несколько макетов). – mah

+0

@mah: вы можете понять, что это особенность реализации и, следовательно, до компилятора (который может быть проинформирован ЦП).В качестве альтернативы вы можете принять практическое представление о том, что размещенная реализация на C++ захочет выдать системные API программисту, поэтому будет использовать ABI OS или близко к нему. В любом случае, связь «extern» C «" связана, и это включает в себя макет основных типов. Практическое представление более полезно для программистов, чистое представление применяется, например, если вы эмулируете одну архитектуру на другой. –

+0

@mah Сорт. Windows работает только на совместимом с Intel, поэтому использует представления Intel. Unix является более общим, но стандарт делает некоторые ограничения по архитектуре (самое главное, что все указатели имеют одинаковый размер и представление), но тот факт, что могут быть варианты, - это то, почему я сказал «большинство Unix-систем». (Некоторые версии Unix работают на мэйнфреймах IBM, и они не используют IEEE. Я подозреваю, что большинство мэйнфреймов IBM используют ОС IBM, а не Unix.) –

Смежные вопросы