Размер типов данных C на разных машинах и sizeof (сложный long double) - PullRequest
2 голосов
/ 24 февраля 2010

Кто-нибудь знает веб-сайт или статью, где размеры типов данных C сравнивались на разных машинах? Меня интересуют значения некоторых «больших» машин, таких как System z или тому подобное.

А: Существует ли верхняя граница байтов, которую может иметь самый большой собственный тип данных на любой машине , и всегда ли он имеет тип complex long double?

Редактировать: Я не уверен, но данные регистра SIMD также используют кэш процессора? Типы данных, которые будут храниться в специальном блоке и не будут использовать кэш L1 / L2 / L, находятся вне моего интереса. Будут рассматриваться только типы {char, short, int, long, long long, float, double, long double, _Bool, void *} (и с _Complex).

Ответы [ 4 ]

6 голосов
/ 24 февраля 2010

Размер типа данных C не зависит от платформы машины. Это зависит от реализации компилятора. Два разных компилятора на одной аппаратной платформе могут по-разному реализовывать базовые типы, что приводит к совершенно разным размерам.

Вам также следует учитывать тот факт, что такие стандартные типы, как size_t, не гарантированно представлены доступными для пользователя типами, такими как unsigned int. Вполне законно и возможно, что size_t может быть реализовано через тип без знака неизвестного размера и диапазона для конкретной реализации.

Кроме того, теоретически (и педантично) язык C не имеет "самого большого" типа с точки зрения размер . Спецификация языка C не дает абсолютно никаких гарантий относительно относительных размеров основных типов. Язык C дает гарантии только относительно относительных диапазонов представимых значений каждого типа. Например, язык гарантирует, что диапазон int не меньше диапазона short. Однако, поскольку [почти] любой тип может содержать произвольное количество битов заполнения, теоретически размер объекта типа short может быть больше, чем у типа int. Это, конечно, очень экзотическая ситуация.

На практике вы можете ожидать, что long long int - это самый большой целочисленный тип, а long double - самый большой тип с плавающей запятой. Вы также можете включить сложные типы в рассмотрение, если хотите.

0 голосов
/ 24 февраля 2010

Вы упоминаете «нативные» типы данных, но обратите внимание, что complex не определяется спецификацией C и, следовательно, не является нативным типом. Нативные типы для C: char, int, float, double и void.

Размер типа данных обычно определяется базовой платформой, а также компилятором. Стандарт C определяет минимальный диапазон для этих типов и определяет несколько относительных отношений (long int должно быть не меньше обычного int и т. Д.). Нет простого способа определить абсолютный размер любого типа без его проверки.

При работе с новой платформой, и я не знаю конкретных размеров типов данных, я пишу короткое приложение, которое выдает результат sizeof для всех стандартных типов Си. Существуют также заголовки, такие как stdint.h, которые предоставляют типы данных, которым можно доверять, чтобы иметь определенный размер.

Не существует верхней границы для размера типа данных. Стандарт C определяет char как «достаточно большой для хранения любого члена набора символов выполнения». Это частично связывает размер нативных типов с архитектурой машины, и поэтому теоретический компьютер с исполнительными символами размером до 1 МБ будет иметь sizeof(char), равный 1 МБ. С практической точки зрения, вы, вероятно, не найдете машину, где это так.

0 голосов
/ 24 февраля 2010

Тип long double на машинах x86 составляет 80 бит (10 байт), http://en.wikipedia.org/wiki/Long_double,, хотя сейчас это более или менее устаревшая форма. x64 не поддерживает это.

0 голосов
/ 24 февраля 2010

Сложность нативных типов в том, что некоторые архитектуры и компиляторы могут их расширять. Например, большинство компиляторов, ориентированных на современное оборудование Intel, предлагают тип данных __m128, который является шириной SIMD-регистра. AVX будет иметь 256-битную ширину SIMD, Larrabee 512bit, и у каждого будет свой собственный тип компилятора.

...