Существует ли какой-либо язык программирования, в котором размеры типов переменных в битах зависят от платформы (32 против 64 бит)? - PullRequest
4 голосов
/ 29 января 2009

Я разработчик C #, и я почти уверен, что на этом языке «int» всегда 32-битный независимо от платформы (32 против 64-битных), «long» всегда 64 бит, с плавающей точкой 32 и двойной 64 и т. д.

Есть какой-нибудь язык, на котором это не так? Где размер int зависит от процессора?

Ответы [ 8 ]

9 голосов
/ 29 января 2009

Размеры int и т. Д. В C / C ++ не определены формально - они зависят от компилятора; см. Здесь для более подробной информации.

К счастью, разработчики C # формально продиктованы в спецификации: int = System.Int32, long = System.Int64 и т. Д., Так что вам не придется беспокоиться об этом. Единственная заметная разница на x64 - IntPtr.Size.

4 голосов
/ 29 января 2009

Например, в C ++ int определяется как «естественный» размер слова процессора. Если вы посмотрите в limit.h (или climits , которые оба являются частью стандартной библиотеки), вы увидите константы INT_MIN и INT_MAX, которые определяют допустимый диапазон int type. Для INT_MIN требуется значение -32767 или менее, а для INT_MAX должно быть не менее 32767.

3 голосов
/ 29 января 2009

Как уже упоминалось в этот вопрос :

Классификация и формальная проверка складывания целочисленных констант

Спецификация языка Java точно определяет, как должны представляться целые числа и как должны оцениваться целочисленные арифметические выражения . Это важное свойство Java, так как этот язык программирования был разработан для использования в распределенных приложениях в Интернете. Требуется, чтобы программа на Java выдавала один и тот же результат независимо от того, на каком компьютере ее выполняла .

Напротив, C (и большинство широко используемых императивов и объектно-ориентированные языки программирования) более небрежны и оставляют открытыми многие важные характеристики. Намерение за этим неточным языком спецификация понятна. Одни и те же программы на Си должны работать на 16-битной, 32-битная или даже 64-битная архитектура путем создания целочисленной арифметики исходные программы с арифметическими операциями, встроенными в целевой процессор. Это приводит к гораздо более эффективному коду, потому что он может использовать доступный машинные операции напрямую. Пока целочисленные вычисления имеют дело только если числа «достаточно малы», несоответствия не возникнут.

В этом смысле целочисленная арифметика C является заполнителем, который точно не определен спецификацией языка программирования, но только полностью определяется путем определения целевой машины.

Java точно определяет, как представлены целые числа и как должна вычисляться целочисленная арифметика.

      Java Integers
--------------------------
Signed         |  Unsigned
--------------------------
long  (64-bit) |
int   (32-bit) |
short (16-bit) |  char (16-bit)
byte  (8-bit)  |

Char - единственный целочисленный тип без знака. Его значения представляют символы Unicode, от \u0000 до \uffff, то есть от 0 до 2 16 -1.

Если у целочисленного оператора есть операнд типа long, то другой операнд также преобразуется в тип long. В противном случае операция выполняется над операндами типа int, при необходимости более короткие операнды преобразуются в int . Правила конвертации точно указаны.

[Из электронных заметок по теоретической информатике 82 № 2 (2003)
Blesner-Blech-COCV 2003: Сабина ГЛЕСНЕР , Ян Олаф БЛЕХ,
Fakultät für Informatik,
Университет Карлсруэ
Карлсруэ, Германия]

2 голосов
/ 29 января 2009

C и C ++ разрешено иметь целые числа переменного размера ... насколько я помню, единственным требованием является то, что small <= int <= long. Поэтому, безусловно, компилятор может выдавать 32-битные целые числа на 32-битной машине и 64-битные целые на 64-битной машине. </p>

Кстати, размеры чисел с плавающей запятой и двойников в C # определены только для хранения - переменным разрешено использовать дополнительную точность. Итак, следующее условие:

class Foo
{
  private float _v = ...; // Definitely 32-bit.

  void Test()
  {
    var v = _v; // Could be 32-, 64-, or 96-bit.

    if(v == _v) {
      ...
    }
  }
}

Может или не может выполнить. (На момент написания CLR обычно использует 96-битный регистр FP в режиме выпуска, если это возможно).

0 голосов
/ 29 января 2009

Размеры типа float и double соответствуют стандартам IEEE, а не компьютерным. Вот почему C #, Java, C, C ++ и любой другой язык, который реализует float и double, имеют одинаковые проблемы с округлением и не могут быть использованы для расчетов денег или любых расчетов, требующих точности.

Размер short, int и long определяются спецификацией языка. Однако вы не хотите, чтобы они были абсолютно произвольными, поскольку это может привести к произвольному поведению при выполнении вычислений с этими числами. Они также могут быть стандартами IEEE, но я не уверен.

0 голосов
/ 29 января 2009

Все, что указывает стандарт C / C ++, это порядковые отношения между размерами различных типов данных. В зависимости от реализации возможны разные размеры, и, скорее всего, они зависят от архитектуры процессора, для которой вы строите; фактически, в GCC long всегда имеют размер слова (код ядра Linux зависит от этой гарантии).

Хорошая практика программирования подразумевает использование sizeof () вместо жестко закодированных размеров.

0 голосов
/ 29 января 2009

c # предоставляет тип, размер которого зависит от процессора, os и флагов битности исполняемого файла IntPtr

Кроме того, любой тип, который сам содержит ссылочный тип, будет различаться по размеру на 32/64 бита, так как сами ссылки имеют размер 32/64 бита.

CLR предоставляет следующие типы, размер которых зависит от разрядности:

  • native int
  • native unsigned int
  • нативные ссылки (т.е. указатели)
0 голосов
/ 29 января 2009

Как сказал Марк Грэвелл в C ++, единственный тип, имеющий официально почти фиксированный размер, определенный для всех платформ, - это char > = 8 бит .

Другие типы больше чем char, но их размер зависит от реализации платформы / компилятора. Стандарт только указывает, что ведьма должна быть больше, чем другая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...