реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Понятие стандартного типа и тип операндов..., 16/32битный Cи компилятор. Хочу раз и на всегда уточнить.
demiurg_spb
сообщение Nov 28 2009, 21:51
Сообщение #16


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Злодей @ Nov 28 2009, 23:57) *
А можно как-нибудь так, чтобы 240 хранилось в int8 или int16, а то int32 как-то накладно выглядит.
P.S: На случай, если они перестанут быть константными или поучаствуют ещё-где-нибудь.
Можно через дефайн. Но потребуется явно приводить их к соответствующему типу для исключения переполнения.
А можно и наоборот приводить к байту или слову в требуемых случаях, когда константы объявлены как UL.
Но проблема ИМХО надуманная. Как это так, они вдруг перестанут быть константами?
Ну а с квалификатором ststic const константы не занимают память вовсе, пока в программе не производится взятие адреса этой константы.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 29 2009, 01:56
Сообщение #17


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
Все выражение разбивается на эти примитивы в соответствии с приоритетом операций. Естественно, скобки влияют на приоритет. Т.е. выражение a = b * c * d - это на самом деле три выражения:
tmp1 = b * c;
tmp2 = tmp1 * d;
operator = (a, tmp2);
И для каждого из них отдельно применяются правила неявных приведений типов.
Вот он, момент истины smile.gif спасибо


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 29 2009, 09:26
Сообщение #18


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(dxp @ Nov 28 2009, 13:39) *
Код
static const uint32_t X_SIZE = 320;
static const uint32_t Y_SIZE = 240;

Зачем такой "огород" с константами и статиками?
Только лишь для того, чтобы автоматически задавать размерность?
Но ведь всё равно при оперировании с любыми константами операнды должны иметь правильную размерность, иначе переполнения и ошибки не избежать.

Как правило, все константы задаются просто через дефайны:
Код
#define X_SIZE 320ul
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 29 2009, 15:13
Сообщение #19


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(demiurg_spb @ Nov 29 2009, 02:47) *
Так будет корректней:
Код
static const uint32_t X_SIZE = 320UL;
static const uint32_t Y_SIZE = 240UL;
uint32_t a = X_SIZE * Y_SIZE;
Без статика возможны "игры разума" компиляторов...
И ещё, никакого оверхеда быть не может, т.к. константные выражения вычислятся при компиляции.

У меня и так его (оверхеда) нет и без статиков, бо С++. smile.gif И указывать суффикс UL тоже излише. Тип и так четко и однозначно указан.

Цитата(Злодей @ Nov 29 2009, 02:57) *
Код
const uint32_t X_SIZE = 320;
const uint32_t Y_SIZE = 240;
uint32_t a = X_SIZE * Y_SIZE;


А можно как-нибудь так, чтобы 240 хранилось в int8 или int16, а то int32 как-то накладно выглядит.

P.S: На случай, если они перестанут быть константными или поучаствуют ещё-где-нибудь.

Можно объявить const uint8_t Y_SIZE = 240;. На дальнейшее использование это не повлияет - в использующем выражении операнды все равно будут приведены к нужному типу.


Цитата(sonycman @ Nov 29 2009, 15:26) *
Как правило, все константы задаются просто через дефайны:
Код
#define X_SIZE 320ul

Задавались. А нынче рулят константы. И нет ни одной причины использовать тут макросы. Зато причин не использовать предостаточно.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
baralgin
сообщение Nov 29 2009, 17:21
Сообщение #20


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



dxp Хм, а если С без плюсов?. Статический массив как бы не объявляется в таком случае.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 29 2009, 20:06
Сообщение #21


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



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


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
baralgin
сообщение Nov 29 2009, 20:16
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



sigmaN Скорее всего моя терминология хромает, я имею ввиду элеметарную ситуацию:
Код
const int x_size = 10;
int x_mas[x_size];
В Си не соберётся.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 29 2009, 20:28
Сообщение #23


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



аа, об этом я уже как-то упоминал.
Не собирается(как мне объяснили) потому, что объявление и инициализация - это разные этапы компиляции. Т.е. на момент первого прохода компилятор ещё ничего не знает о том, что x_size == 10. Выходом из этой ситуации может быть enum или #define

Как там с подобными конструкциями в плюсах - не знаю....может там и соберется.

Цитата
Скорее всего моя терминология хромает, я имею ввиду элеметарную ситуацию:
да нет, скорее всего я просто Вас неправильно понял и дал ответ на совершенно иной вопрос smile.gif

тут найдете много чего полезного http://electronix.ru/forum/index.php?showtopic=68225


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 30 2009, 04:40
Сообщение #24


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(baralgin @ Nov 29 2009, 23:21) *
dxp Хм, а если С без плюсов?. Статический массив как бы не объявляется в таком случае.

Не понял вопроса. Если на С и хочется, чтобы в память не легло, то надо объявлять как static. При этом если нет попыток взятия адреса, то и причин у компилятора заводить под это память не будет - все значения он сможет вычислить на этапе компиляции.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
baralgin
сообщение Nov 30 2009, 08:29
Сообщение #25


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



dxp в привидённом выше примере static не спасает. Я обычно все глобальные переменные static'ом обзываю (от греха подальше). Ну да ладно, читаю вышерекомендованную тему, делаю выводы. Тут это всё же офтоп.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 1 2009, 06:47
Сообщение #26


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(baralgin @ Nov 30 2009, 11:29) *
Я обычно все глобальные переменные static'ом обзываю (от греха подальше).
Вы имеете ввиду глобальные константы? Ибо переменная в модуле становится локальной... Ну и все подряд константы делать статическими тоже неверно...


Цитата(dxp @ Nov 29 2009, 18:13) *
У меня и так его (оверхеда) нет и без статиков, бо С++. smile.gif
Ну так а тожsmile.gif
Цитата
Можно объявить const uint8_t Y_SIZE = 240;
На дальнейшее использование это не повлияет - в использующем выражении операнды все равно будут приведены к нужному типу.
Ещё как повлияет, если в int не впишется...
Цитата
Задавались. А нынче рулят константы. И нет ни одной причины использовать тут макросы. Зато причин не использовать предостаточно.
+1


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
baralgin
сообщение Dec 1 2009, 08:17
Сообщение #27


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



Цитата(demiurg_spb @ Dec 1 2009, 08:47) *
Вы имеете ввиду глобальные константы? Ибо переменная в модуле становится локальной... Ну и все подряд константы делать статическими тоже неверно...

Не, я имел ввиду переменные и локальность это только плюс(практически плюсплюс smile.gif ). Const'антами пользуюсь пока крайне умеренно. Тут больше вопрос не "что использовать define или const", а "Си или С++".
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 20:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01449 секунд с 7
ELECTRONIX ©2004-2016