Вопрос

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

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

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

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

Это было полезно?

Решение

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

Это позволит вам использовать uint32_t и <=>, а также 8, 16 и 64 и многие другие.

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

Другие советы

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

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

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

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

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

<Ч>

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

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

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

  • Эти типы являются необязательными. Однако если реализация предоставляет целочисленные типы с шириной 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
    

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

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

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

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

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

    http://gmplib.org/

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top