Перейти к содержанию

Проблемы с типом int


Гость

Рекомендуемые сообщения

Привет All!!!

Не секрет, что в 32 разрядных операционных системах (таких как Linux), sizeof(int)=4. Что нужно сделать, чтоб вернуть int к размеру 16 бит (2 байта). Всеми местами чувствую, что это как-то делается с директивами препроцессора, а вот какими???

Ссылка на комментарий
Поделиться на другие сайты

>32 разрядных операционных системах (таких как Linux)

Чушь. Система не может быть сколько-то разрядная. Иначе это плохая система. Разрядность зависит от архитектуры - на x86 - 32 бита, а на IA-64, например, 64 бита.

>Что нужно сделать, чтоб вернуть int к размеру 16 бит (2 байта).

Объясни, для чего тебе это нужно. В большинстве случаев зашивать зависимость от разрядности в программу - плохо, и почти всегда есть лучшие способы.

В крайнем случае можно написать:

typedef short int int_16;

И потом пользоваться int_16, но short int не обязан быть 16 бит. Зато при переносе придется исправить только эту одну строчку.

В стандарте C ничего не говорится о размерности типов данных. Гарантируется только что char <= short int <= int <= long int.

Ссылка на комментарий
Поделиться на другие сайты

Разумеется, никакими директивами тип int нельзя сделать

16-битным (если речь идет об gcc для x86) -- в том числе потому

что gcc изначально ориентирован на как минимум 32-битную архитектуру.

В принципе, конечно можно сделать так: -Dint=short в качестве

опции компилятору -- но при этом, разумеется, нельзя использовать

*ни одного* заголовочного файла, так что практическая ценность

этого "приема" минимальна.

Если нужны типы с гарантированной разрядностью -- в новом

стандарте C (C99) они определены как: `int_t' и

`uint_t' -- для их использования нужно подключать

или . Но тут надо иметь в виду, что

(1) далеко не все системы поддерживают С99 (gcc+glibc поддерживают с известными оговорками)

(2) стандарт не требует чтобы эти типы существовали на каждой

системе.

Ссылка на комментарий
Поделиться на другие сайты

> Чушь. Система не может быть сколько-то разрядная.

А ты попробуй сделать printf("%d",sizeof(int)) в досовском BorlandC, а потом в gcc.

>Объясни, для чего тебе это нужно.

Есть файл BMP который я хочу считать и обрабатывать. Нашел в нете его описание и собираюсь сделать библиотеку для работы с этим форматом. Но из-за разной размерности int и др типов в разных системах библиотека не будет универсальной

типа struct my_struct{

int x;

int y;

};

теперь нужно считать из фаила fread-ом эту структуру, но из за разной размерности int в DOS будет считано 4 байта, а в Linux - 8 байт.

Вот в этом-то и проблемка.

Ссылка на комментарий
Поделиться на другие сайты

Вообще-то, на большинстве современных платформ 16-битный тип --

это short. Про новые типы C99 я уже говорил. На самом деле,

обычно используется нечто вроде следующего:

#ifdef HAVE_INT16_T

typedef int16_t myint16;

#elif SIZEOF_INT == 2

typedef int myint16;

#elif SIZEOF_SHORT == 2

typedef short myint16;

#else

#error "No 16 bit type available"

#endif

На самом деле, я не очень понимаю, зачем делать библиотеку для

работы с BMP -- да еще которая бы работала и в 16-битной среде.

ImageMagick не катит? Можно, наверное, и что попроще найти.

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

#include

....

int main()

{

u_int16_t

}

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

Ссылка на комментарий
Поделиться на другие сайты

  • 6 месяцев спустя...

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...