Размер int в C на разных архитектурах - PullRequest
9 голосов
/ 23 октября 2009

Мне известно, что спецификация языка C не определяет точный размер каждого целочисленного типа (например, int).

Что мне интересно, так это: есть ли способ в C (не в C ++) определить целочисленный тип с определенным размером, который гарантирует, что он будет одинаковым для разных архитектур? Как:

typedef int8 <an integer with 8 bits>
typedef int16 <an integer with 16 bits>

Или любым другим способом, который позволит другим частям программы быть скомпилированными на другой архитектуре.

Ответы [ 7 ]

15 голосов
/ 23 октября 2009

То, что вы хотите, это <stdint.h>, который будут реализованы компиляторами, которые соответствуют стандарту C ("C99"). К сожалению, это не относится к Microsoft. К счастью, проект с открытым исходным кодом предоставляет <stdint.h> для Windows, см. msinttypes .

Это позволит вам использовать int32_t и uint32_t, плюс 8, 16 и 64 и многие другие.

Примечание: сам файл заголовка не является обязательным в стандарте, однако, большинство типов в заголовке являются индивидуально необязательными. Некоторые нет. Наиболее часто используемые типы являются дополнительными, но ничто не мешает вам использовать требуемые. Дело в том, что если реализация вообще предоставляет заголовок, на практике они определяют все типы.

13 голосов
/ 23 октября 2009

C99, в stdint.h , определяет типы, такие как int8_t и int16_t.

5 голосов
/ 23 октября 2009

Нет, стандарт C определяет минимальные размеры для целочисленных типов, но не дает никаких гарантий на максимальные размеры.

Реализация должна предоставлять intN_t типы, если доступны типы такого размера. Я только упоминаю, что, поскольку у вас был кроссплатформенный тег - реализация, у которой нет типа правильной ширины в битах, не должна предоставлять эти типы.

Как правило, вы можете выбрать (с настройкой, например, с помощью cc -D_INT16_IS_INT и #ifdef s) правильный тип для использования для определенного размера бит. Вы можете разработать необходимые определения для каждой платформы, которую вы хотите поддерживать с помощью кода C, используя CHAR_BIT и sizeof().

Соответствующий раздел черновика c1x (n1362):


7.18.1.1 Целочисленные типы точной ширины

  1. Имя typedef intN_t обозначает целочисленный тип со знаком со шириной N, без битов заполнения и представление дополнения до двух. Таким образом, int8_t обозначает целочисленный тип со знаком шириной ровно 8 бит.

  2. Имя typedef uintN_t обозначает целочисленный тип без знака с шириной N. Таким образом, uint24_t обозначает целочисленный тип без знака с шириной ровно 24 бита.

  3. Эти типы не являются обязательными. Однако если реализация предоставляет целочисленные типы с шириной 8, 16, 32 или 64 бита, без битов заполнения и (для типов со знаком), которые имеют представление дополнения до двух, она должна определять соответствующие имена typedef.


Относительно выбора типов должно хватить что-то вроде этого:

#ifdef INT32_IS_SHORT
    typedef short INT32
#endif
#ifdef INT32_IS_INT
    typedef int INT32
#endif
#ifdef INT32_IS_LONG
    typedef long INT32
#endif
2 голосов
/ 23 октября 2009

Возможно, вы захотите взглянуть на pstdint.h . Это переносимая реализация stdint.h, не требующая поддержки компилятора C99.

2 голосов
/ 23 октября 2009

Насколько я знаю, ответ - нет. Мы кодируем для разных платформ и просто используем typedef для конкретных платформ, используя # if / # else. Например, для Win32: typedef int int32;

2 голосов
/ 23 октября 2009

Если вы не проверите для каждой платформы с #ifdef или около того, я сомневаюсь, что это легко возможно. Но многие библиотеки уже выполняют эту задачу для вас. Для MSVC это __int8, __int16 и т. Д. В библиотеке GTK есть похожие определения типов.

0 голосов
/ 23 октября 2009

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

На самом деле вам не нужно реализовывать такую ​​библиотеку, потому что GNU MP уже обрабатывает это.

http://gmplib.org/

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