Нужно ли иметь 64-битный процессор, чтобы использовать 64-битный тип данных - PullRequest
17 голосов
/ 03 апреля 2011

У меня есть несколько вопросов:

  1. Нужно ли иметь 64-битный процессор для использования 64-битного типа данных (__ int64 или int64_t)?

  2. Что означает "t" в int64_t?

  3. Начиная с какой версии GCC и VCC поддерживается тип данных?

  4. Является ли 64-битный тип данных только удвоением длины данных или есть какие-то другие вещи, скрывающиеся под рукой?

Ответы [ 4 ]

18 голосов
/ 03 апреля 2011

Вам не нужен 64-битный процессор, чтобы использовать 64-битный тип данных.Все зависит от компилятора и только от компилятора.Компилятор может предоставить вам 128-битный, 237-битный или 803-битный тип данных, если он того пожелает.

Однако имейте в виду, что обычно 32-разрядные процессоры не могут напрямую обрабатывать 64-разрядные значения, что означает, что бремя поддержки всех необходимых языковых операций для 64-разрядного типа лежит на компиляторе и библиотеке.Компилятор должен будет генерировать более или менее сложную последовательность 32-битных инструкций процессора, чтобы выполнять сложения, сдвиги, умножения и т. Д. Для 64-битных значений.Это означает, что в коде, сгенерированном для 32-битных процессоров, базовые языковые операции над 64-битными типами данных не будут такими эффективными, как в коде, сгенерированном для 64-битных процессоров (поскольку в последнем случае большинство языковых операций будет выполнятьсяотдельная инструкция CPU).

«t» в int64_t означает «type» или «typedef name».Это старое общепринятое соглашение об именах для стандартной библиотеки typedefs.

Что касается версий компилятора, то это на самом деле неоднозначный вопрос.Имя typedef int64_t является частью стандартной библиотеки языка C (но не языка C ++), в то время как поддержка 64-битных целочисленных типов (под любым именем) является частью компилятора.Так о чем ты спрашиваешь?Например, компилятор MSVC долгое время поддерживал 64-битные типы данных, но имена для этих типов были разными.64-разрядное целое число со знаком в MSVC называется __int64 чего-то подобного.Что касается int64_t typedef, AFAIK, он не является частью стандартной библиотеки MSVC даже сегодня.Фактически, int64_t стал частью языка C из версии его спецификации C99.В то же время он не является частью языка C ++.Так что, как правило, вы не должны ожидать, что в коде C ++ будет int64_t независимо от версии компилятора.

Что касается длины данных ... Ну, да, это просто удвоение числабиты.Остальное следует.

8 голосов
/ 03 апреля 2011
  1. Нет, вы можете обрабатывать такие данные на 32-битной машине. Пока ваш компилятор поддерживает эти типы данных, у вас все в порядке.
  2. int64_t - это просто его имя, как определено в стандарте.
  3. Я думаю, что все версии GCC и MSVC этого столетия поддерживают 64-разрядные целые числа в 32-разрядной архитектуре.
  4. 64-битное целое число в два раза больше 32-битного.
3 голосов
/ 03 апреля 2011

Если вы посмотрите на /usr/include/stdint.h, вы обнаружите, что int64_t определяется как

typedef long long int int64_t;

Так что, как сказал Дэвид, это компилятор, а не архитектура.

0 голосов
/ 03 апреля 2011

Нет, компиляторы на 32-битных архитектурах эмулируют 64-битную арифметику.Это не очень быстро, но не так уж плохо.

t относится к type.Это унаследовано от C, где структуры должны быть отнесены по-разному.

64-битные целочисленные типы могут иметь улучшенное выравнивание, но это все.

Я понятия не имею для пункта 3.

...