Мне нужно, чтобы 64-разрядный процессор использовал 64-битный тип данных

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

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

  • Что означает "t" для int64_t?

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

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

Ответы

Ответ 1

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

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

"t" в int64_t обозначает либо "тип", либо "typedef name". Это старое принятое соглашение об именах для типичных типов typedefs.

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

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

Ответ 2

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

Ответ 3

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

typedef long long int int64_t;

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

Ответ 4

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

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

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

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