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

 
 
> Макрос инкремента с насыщением.
adnega
сообщение Dec 16 2012, 16:37
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Имеем gcc, пишем на C.

Задача: нужно написать некоторый макрос TICK(x), который бы при каждом вызове увеличивал переменную x на константу TO_TICK, но с учетом переполнения. Т.е. в случае если добавление TO_TICK вызовет переполнение, переменную x не изменять. Тип переменной x может быть любой целый (в том числе битовое поле).

Вариант 1:
Код
#define TICK(x) do{if((x + TO_TICK) > x) x += TO_TICK;}while(0)

не помогает, в случае знакового x и беззнакового TO_TICK. Видимо, (x + TO_TICK) считается беззнаковым и сравнивается с беззнаковым x.

Вариант 2:
Код
#define TICK2(x) do{typedef typeof(x) _tx; _tx _x = x; _x += TO_TICK; if(_x > x) x = _x;}while(0)

в принципе устраивает, но не работает с битовыми полями.

Параллельно узнал, что char без указания знаковости в "gcc version 4.8.0 20121121 (experimental) (Klen's GNU package (KGP) for ARM/elf platform)" является unsigned, хотя везде указывается диапазон char от -128 до 127. В "gcc версия 4.4.3 (GCC)" под Linux char знаковый.

Где нужно читать о типах данных C/GCC и приведении типов в арифметических операциях и операциях сравнения?
Кстати, при различных уровнях оптимизации результат тоже получаю различный. Хочется большей строгости...

Спасет ли переход на C++/GCC ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
andrew_b
сообщение Dec 17 2012, 06:55
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(adnega @ Dec 16 2012, 20:37) *
Параллельно узнал, что char без указания знаковости в "gcc version 4.8.0 20121121 (experimental) (Klen's GNU package (KGP) for ARM/elf platform)" является unsigned, хотя везде указывается диапазон char от -128 до 127. В "gcc версия 4.4.3 (GCC)" под Linux char знаковый.

Где нужно читать о типах данных C/GCC и приведении типов в арифметических операциях и операциях сравнения?
Читать нужно стандарт языка Си.
Цитата
15 The three types char, signed char, and unsigned char are collectively called
the character types. The implementation shall define char to have the same range,
representation, and behavior as either signed char or unsigned char.

Иными словами, знаковость типа char зависит от реализации.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- adnega   Макрос инкремента с насыщением.   Dec 16 2012, 16:37
- - _Pasha   Код#define TICK(x) do{ unsigned char a = x...   Dec 16 2012, 16:59
|- - adnega   Цитата(_Pasha @ Dec 16 2012, 20:59) и воо...   Dec 16 2012, 17:46
|- - _Pasha   Цитата(adnega @ Dec 16 2012, 20:46) Чтобы...   Dec 16 2012, 18:26
|- - adnega   Цитата(_Pasha @ Dec 16 2012, 22:26) Во...   Dec 16 2012, 18:29
|- - _Pasha   Цитата(adnega @ Dec 16 2012, 21:29) А то...   Dec 16 2012, 18:40
- - adnega   Цитата(adnega @ Dec 16 2012, 20:37) Вариа...   Dec 16 2012, 18:52
|- - _Артём_   Цитата(adnega @ Dec 16 2012, 20:52) Сдела...   Dec 16 2012, 19:09
|- - adnega   Цитата(adnega @ Dec 16 2012, 22:52) Не ра...   Dec 16 2012, 19:14
|- - _Артём_   Цитата(adnega @ Dec 16 2012, 21:14) Потом...   Dec 16 2012, 19:21
- - _Pasha   Попутно еще замечание, что параметр функции const ...   Dec 16 2012, 20:33
- - polyname   может лучше сравнивать с разностью ? Код#define AD...   Dec 17 2012, 06:11
- - ARV   #define TICK(x) x = ((x) + TO_TICK) < (x) ? (x)...   Dec 17 2012, 18:35
- - ViKo   Цитата(adnega @ Dec 16 2012, 19:37) Задач...   Dec 17 2012, 19:03
|- - adnega   Цитата(ViKo @ Dec 17 2012, 23:03) А вам т...   Dec 17 2012, 19:32
- - ReAl   Цитата(adnega @ Dec 16 2012, 18:37) не по...   Dec 18 2012, 13:02
|- - adnega   Цитата(ReAl @ Dec 18 2012, 17:02) Конечно...   Dec 20 2012, 10:40
|- - scifi   Цитата(adnega @ Dec 20 2012, 14:40) Я-то ...   Dec 20 2012, 11:09
- - _Pasha   Мне интересно другое. А насыщение в виде равенства...   Dec 20 2012, 12:00


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

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 14:24
Рейтинг@Mail.ru


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