В мире Unix было несколько возможных расположений относительно размеров целых чисел и указателей для 64-разрядных платформ. Два, главным образом широко используемые, были ILP64 (на самом деле, только очень немного примеров этого; Cray была один таким), и LP64 (почти для всего остального). acronynms прибывают из 'интервала, долго, указатели являются 64-разрядными' и 'долго, указатели являются 64-разрядными'.
Type ILP64 LP64 LLP64
char 8 8 8
short 16 16 16
int 64 32 32
long 64 64 32
long long 64 64 64
pointer 64 64 64
от системы ILP64 отказались в пользу [1 112] LP64 (то есть, почти все более поздние участники использовали LP64, на основе рекомендаций группы Аспена; только системы с долгим наследием 64-разрядной операции используют другую схему). Все современные 64-разрядные системы Unix используют LP64. MacOS X и Linux являются оба современными 64-разрядными системами.
Microsoft использует другую схему перехода к 64-разрядному: LLP64 ('долго долго, указатели являются 64-разрядными'). Это имеет заслугу означать, что 32-разрядное программное обеспечение может быть перекомпилировано без изменения. Это имеет недостаток того, чтобы быть отличающимся от того, что все остальные делают и также требуют, чтобы код был пересмотрен для использования 64-разрядных мощностей. Всегда был необходимый пересмотр; это был просто другой набор изменений от тех необходимых на платформах Unix.
, Если Вы разрабатываете свое программное обеспечение на основе независимых от платформы имен целого типа, вероятно, с помощью заголовка C99 <inttypes.h>
, который, когда типы доступны на платформе, обеспечивает в со знаком (перечисленном) и неподписанном (не перечисленный; префикс с 'u'):
int8_t
- 8-разрядные целые числа int16_t
- 16-разрядные целые числа int32_t
- 32-разрядные целые числа int64_t
- 64-разрядные целые числа uintptr_t
- целые числа без знака, достаточно большие для содержания указателей intmax_t
- самый большой размер целого числа на платформе (могло бы быть больше, чем int64_t
) , можно затем кодировать приложение с помощью этих типов, где это имеет значение, и быть очень осторожным с системными типами (который мог бы отличаться). Существует intptr_t
тип - тип целого числа со знаком для содержания указателей; необходимо запланировать не использование его или только использование его как результат вычитания два uintptr_t
значения (ptrdiff_t
).
, Но, как вопрос указывает (в недоверии), существуют различные системы для размеров целочисленных типов данных на 64-разрядных машинах. Привыкните к нему; мир не собирается изменяться.
Эта статья о ссылках MSDN много псевдонимов типа (доступный в Windows), которые являются немного более явными относительно их ширины:
http://msdn.microsoft.com/en-us/library/aa505945.aspx
, Например, хотя можно использовать ULONGLONG для ссылки на 64-разрядное неподписанное интегральное значение, можно также использовать UINT64. (То же идет для ULONG и UINT32.), Возможно, они будут немного более ясными?
Microsoft также определила UINT_PTR и INT_PTR для целых чисел, которые являются тем же размером как указатель.
Вот список определенных типов Microsoft - это - часть их ссылки драйвера, но я полагаю, что это допустимо для общего программирования также.
Если необходимо использовать целые числа определенной длины, вероятно, необходимо использовать некоторые независимые от платформы заголовки для помощи Вам. Повышение является хорошим местом для взгляда на.
Самый легкий способ узнать его для Вашего компилятора/платформы:
#include <iostream>
int main() {
std::cout << sizeof(long)*8 << std::endl;
}
Themultiplication 8 должен получить биты от байтов.
при необходимости в конкретном размере является часто самым легким использовать один из предварительно определенных типов библиотеки. Если это - нежелательный, можно сделать то, что часто происходит с autoconf программным обеспечением, и имейте систему конфигурации, определяют правильный тип для необходимого размера.