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

 
 
> IAR 2.10.5 STM8
-AZ-
сообщение Dec 24 2015, 22:35
Сообщение #1


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

Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488



Кто то может уже натыкался на данную проблему, подскажите пожалуйста
Пишу:
Код
unsigned long long i;
i=(((unsigned long long)1)<<0x20);

так вот без ошибки компилирует если сдиг не более 0x1F, если 0x20 и больше выдает ошибку - Warning[Pe063]: shift count is too large
Как это победить, в чем проблема?

Сообщение отредактировал IgorKossak - Dec 25 2015, 10:53
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aiwa
сообщение Dec 27 2015, 18:59
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Жестокий у Вас препод, если С++ не разрешает.
На С реализация только через структуры и функцию заменяющую "<<", потому что переопределение операторов С не поддерживает.
Поэтому у Вас, при условии на С и обязательно оставить "<<", есть два варианта:
1. Уговорить участников группы стандартизации С внести в стандарт желаемые изменения.
2. если оператор действительно работает для 64-бит как Вы это утверждаете, то попытаться использовать этот бонус, предоставленный IARом.
но я бы рекомендовал бы проверить работает ли он или только компилится с предупреждением.

P.S. Чтобы Вы не теряли время на проверку работоспособности: скорее всего IAR действительно добросовестно производит сдвиг,
но начиная с момента когда сдвигаемая единица вылазит за 32 бита в 7-й байт, переменная всегда будет равна 0, а не (1<<0x20) и т.д.

Сообщение отредактировал aiwa - Dec 27 2015, 19:21
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 28 2015, 03:48
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(aiwa @ Dec 27 2015, 21:59) *
но начиная с момента когда сдвигаемая единица вылазит за 32 бита в 7-й байт, переменная всегда будет равна 0, а не (1<<0x20) и т.д.

Я потерял нить, почему? Компилятор вдруг забыл тип переменной?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
aiwa
сообщение Dec 28 2015, 09:49
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(Dog Pawlowa @ Dec 28 2015, 05:48) *
Я потерял нить, почему? Компилятор вдруг забыл тип переменной?


Потому что для STM8 IAR декларировал разрядность типа 'long long' в 32 бита в отличие например от их же AVR8, где она 64 бита.
Поэтому качестве оператора '<<' будет выступать ассемблерная подпрограмма производящая сдвижку только по 4-м байтам, т.е. 32 бита.

Картина похожая на ту, если к 'unsigned char' прибавлять число, большее 256 и результат вылазит за пределы байта,
только с тем отличием, что при сложении в переменная будет содержать кусок результата по модулю 256,
а при сдвиге механизм сдвижки обнуляет освободившийся хвост, и переменная будет = 0;


Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 28 2015, 12:01
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(aiwa @ Dec 28 2015, 12:49) *
декларировал разрядность типа 'long long' в 32 бита

Да, проверил, 64-битные переменные и в stdint не работают, даже с #pragma language=extended
Значит, только ручками.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- phenixs   IAR 2.10.5 STM8   Dec 24 2015, 22:35
- - aiwa   Это не ошибка, а предупреждение, что разрядность т...   Dec 25 2015, 00:46
|- - phenixs   То что 32 бита это я уже понял, как примерно оформ...   Dec 25 2015, 04:38
- - Непомнящий Евгений   Кодstruct U64 { uint32_t low, hi; }; ну и даль...   Dec 25 2015, 06:15
|- - phenixs   У меня единственная операция, это сдвиг вправо(вле...   Dec 25 2015, 08:46
- - Непомнящий Евгений   Если я ничего не напутал, то что-то в таком духе К...   Dec 25 2015, 08:57
|- - phenixs   ну похоже.. я вот не пойму в чем прикол, IAR именн...   Dec 25 2015, 09:25
|- - Непомнящий Евгений   Цитата(phenixs @ Dec 25 2015, 12:25) я во...   Dec 25 2015, 09:28
|- - phenixs   Цитата(Непомнящий Евгений @ Dec 25 2015, 12...   Dec 25 2015, 09:39
|- - Непомнящий Евгений   Цитата(phenixs @ Dec 25 2015, 12:39) А не...   Dec 25 2015, 09:56
- - aiwa   Цитата(phenixs @ Dec 25 2015, 10:46) У ме...   Dec 25 2015, 10:01
|- - phenixs   Это все ужасно долго, нужно сделать 1 сдвиг, потом...   Dec 25 2015, 12:04
|- - scifi   Цитата(phenixs @ Dec 25 2015, 15:04) Это ...   Dec 25 2015, 18:47
|- - phenixs   Цитата(scifi @ Dec 25 2015, 21:47) Ну тог...   Dec 25 2015, 19:52
||- - aiwa   Цитата(phenixs @ Dec 25 2015, 21:52) а во...   Dec 25 2015, 21:31
||- - phenixs   Без С++ class не собирается, как правильно это на ...   Dec 27 2015, 10:40
|- - phenixs   Цитата(scifi @ Dec 25 2015, 21:47) Ну тог...   Dec 28 2015, 04:56
- - aiwa   Цитата(phenixs @ Dec 25 2015, 14:04) Это ...   Dec 25 2015, 13:48
|- - phenixs   Сечас попробую так временные интервалы измерить......   Dec 25 2015, 15:29


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

 


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


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