Jump to content

    
Sign in to follow this  
Sergey-Ufa

Эквивалентность типов

Recommended Posts

Для "стандартных" типов данных в общем случае справедливо следующее неравенство:

 

sizeof(long) >= sizeof(int) >= sizeof(short) >= sizeof(char)

 

И - всё! Поэтому ответ на Ваш вопрос - нет.

Share this post


Link to post
Share on other sites
Эквивалентен ли тип _int8 типу char. а тип _int32 типу long int?

 

Никак нет. _int8, _int32 это нестандартные типы, которые каждый волен объявить как угодно. char стандартный, и может быть размером 8 бит или более (в некоторых реальных компиляторах он 16-битный). long int - тоже стандартный - минимум 32 бита, нередко реально 64-битный, встречал еще 40-битый.

 

Если брать стандарт 2011, то char эквивалентен int_least8_t, а long int - int_least32_t (и то не уверен, вспоминая 40-битные DSP-шные лонги, а int_least32 там вроде и есть 32)

Share this post


Link to post
Share on other sites

Вопрос собственно возник по следующей причине. Программа WinFilter генерирует код реализации цифрового фильтра на С. Вот кусочки из него:

static __int32 y[NCoef+1]; //output samples

static __int16 x[NCoef+1]; //input samples

__int8 iir(__int8 NewSample) {...};

В компиляторе CVAVR этих типов нет. Я предположил, что можно изменить код таким образом:

static long int y[NCoef+1]; //output samples

static int x[NCoef+1]; //input samples

char iir(char NewSample) {...};

Будет ли это корректно? Спасибо всем, кто откликнулся.

Share this post


Link to post
Share on other sites
В компиляторе CVAVR этих типов нет.

 

Если этих типов компилятор не знает, то это просто замечательно! Тогда вы просто определите эти типы через #define и радуйтесь. А во всей программе делать замены не надо.

Share this post


Link to post
Share on other sites

Хорошо, делаем так:

 

typedef signed long int _int32;

typedef signed int _int16;

typedef signed char _int8;

 

Но будет ли эквивалентна такая замена для выполнения кода? Вопрос, собственно, был именно об этом.

Share this post


Link to post
Share on other sites

А это зависит от того, какой у вас процессор. На 32-разрядном ARM-е, например, signed int будет иметь ширину 32 бита.

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

С ним всё будет просто и однозначно:

#include <stdint.h>
typedef int32_t _int32;
typedef int16_t _int16;
typedef int8_t _int8;

Share this post


Link to post
Share on other sites
Но будет ли эквивалентна такая замена для выполнения кода? Вопрос, собственно, был именно об этом.
Скажем так: работать это будет. В случае AVR это будет, скорее всего, оптимально и по быстродействию, и по объему кода. Если вы возьмете более другой процессор - надо будет детально вникать в код. Возможно более "длинный" тип будет работать быстрее или операции с ним будут занимать меньше памяти кода.

 

 

С ним всё будет просто и однозначно
Пока вы не дочитатете до определений типов uint_fastXX_t и uint_leastXX_t :)

 

Share this post


Link to post
Share on other sites
Пока вы не дочитатете до определений типов uint_fastXX_t и uint_leastXX_t :)

А эти типы добавлены специально для того, чтобы программистам жизнь мёдом не казалась:)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this