|
Детская ошибка |
|
|
|
May 2 2016, 06:22
|
Частый гость
 
Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612

|
Недавно столкнулся с одной странностью (по крайней мере для меня). Хотелось бы понять. Есть фрагмент года (упрощенный до безобразия): CODE int16u temp1, temp2; for (int32u i = 0; i < 10; i++) { temp1 = 0x0001; temp2 = 0xFFFE; if (~temp1 != temp2) continue; temp2 = temp1; }
Так вот, в этом фрагменте условный оператор и код после него никогда не выполняется. В отладчике после выполнения операции "temp2 = 0xFFFE;" происходит сразу переход на начало цикла. Переменные объявлены как int16u (== unsigned short (16 бит беззнаковое)) При этом никаких предупреждений на этапе компиляции. Если переменные объявить как int32u (== unsigned long (32 бита беззнаковое)), то условный оператор выполняется, но естественно результат всегда true. И код работает как надо только в таком варианте: CODE int16u temp1, temp2; for (int32u i = 0; i < 10; i++) { temp1 = 0x0001; temp2 = 0xFFFE; temp1 = ~temp1; if (temp1 != temp2) continue; temp2 = temp1; }
В этом случае выполняются все операторы, входящие в тело цикла. IAR C/C++ Compiler for ARM 7.40.3.8902 (7.40.3.8902) Добавлю: Оптимизация отключена. Проект под микроконтроллер STM32F105VCT6
Сообщение отредактировал amiller - May 2 2016, 06:41
|
|
|
|
|
 |
Ответов
|
May 9 2016, 23:30
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(halfdoom @ May 9 2016, 17:51)  Если сделать первый операнд знаковым, то результат может показаться странным, т.к. числа до 0х8000 будут давать другой результат. Вот как раз если первый операнд сделать знаковым, то в случае операции ~ красота картинки сохранится: temp2 = 0xFFFE расширится его до 0xFFFFFFFE, а последующая операция ~temp2 обнулит лишние старшие навязанные два байта. Поэтому в начальном примере код if(~(signed int16)temp2 !=temp1) continue; даст ожидаемый результат. Цитата(halfdoom @ May 9 2016, 17:51)  И что вас здесь смущает? Согласно великому классику "В компиляторе все должно быть прекрасно...". В нашем конкретном случае с логическими побитовыми операциями вынужденность добавления явных преобразований похожих на Код if(~(signed int16)temp2 !=temp1) continue;
либо
if( (unsigned int16)(~temp2) !=temp1) continue; наводит на мысль, что некоторые моменты в стандарте шиворот-навыворот.
Сообщение отредактировал aiwa - May 9 2016, 23:31
|
|
|
|
|
May 10 2016, 04:20
|

Профессионал
    
Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072

|
Цитата(aiwa @ May 10 2016, 02:30)  наводит на мысль, что некоторые моменты в стандарте шиворот-навыворот. Стандарт не обязан быть логичным для всех, потому что это стандарт. Однако если вспомнить, что все операции над переменными типа char и short производятся только после приведения к типу int, то многое становится понятным. Почему к int? Потому что существовали и, видимо, существуют архитектуры в которых арифметические операции возможны только для операндов с размером машинного слова, которое и представлено типом int. Иными словами, правила преобразований в С архитектурно зависимы, и в спорных случаях следует использовать явное приведение типов. Кроме того, попробуйте разобраться, как должны работать следующие операторы: Код unsigned short a, b;
if (~(a + b) & ~0xf) {...}
short a, b;
if (~(a + b) & ~0xf) {...}
|
|
|
|
Сообщений в этой теме
amiller Детская ошибка May 2 2016, 06:22 AleksBak А если так:
Кодint16u temp1, temp2;
for (int3... May 2 2016, 07:08 amiller Цитата(AleksBak @ May 2 2016, 10:08) А ес... May 2 2016, 07:16  Сергей Борщ QUOTE (amiller @ May 2 2016, 10:16) После... May 2 2016, 07:24   amiller Цитата(Сергей Борщ @ May 2 2016, 10:24) М... May 2 2016, 07:36    Сергей Борщ QUOTE (amiller @ May 2 2016, 10:36) Ну а ... May 2 2016, 08:09     amiller Цитата(Сергей Борщ @ May 2 2016, 11:09) Д... May 2 2016, 08:21  scifi Цитата(amiller @ May 2 2016, 10:16) Но бо... May 2 2016, 11:30   amiller Цитата(scifi @ May 2 2016, 14:26) Вы буде... May 2 2016, 11:35    AleksBak Цитата(amiller @ May 2 2016, 15:35) В это... May 2 2016, 12:20    GetSmart Цитата(amiller @ May 2 2016, 15:35) В это... May 2 2016, 13:49     Baser Цитата(GetSmart @ May 2 2016, 16:49) Обна... May 2 2016, 16:18     ViKo Цитата(GetSmart @ May 2 2016, 16:49) Обна... May 2 2016, 16:19     Огурцов Цитата(GetSmart @ May 2 2016, 13:49) Хоро... May 2 2016, 16:36     jcxz Цитата(GetSmart @ May 2 2016, 19:49) Код{... May 3 2016, 15:33      GetSmart Цитата(jcxz @ May 3 2016, 19:33) И что в ... May 3 2016, 16:23       zltigo QUOTE (GetSmart @ May 3 2016, 19:23) Искр... May 3 2016, 19:47        GetSmart Цитата(zltigo @ May 3 2016, 23:47) Так чт... May 3 2016, 21:42    Tahoe Цитата(amiller @ May 2 2016, 14:35) Ошибк... May 6 2016, 04:58     amiller Цитата(Tahoe @ May 6 2016, 07:58) 1. Стра... May 6 2016, 06:23      Tahoe Цитата(amiller @ May 6 2016, 09:23) Если ... May 6 2016, 08:32       scifi Цитата(Tahoe @ May 6 2016, 11:32) Еще раз... May 6 2016, 08:45       amiller Цитата(Tahoe @ May 6 2016, 11:32) Еще раз... May 6 2016, 08:58        zltigo QUOTE (amiller @ May 6 2016, 11:58) И в о... May 6 2016, 13:44         amiller Цитата(zltigo @ May 6 2016, 16:44) Опять ... May 6 2016, 14:19          scifi Цитата(amiller @ May 6 2016, 17:19) 1. Ес... May 6 2016, 15:29           Огурцов Цитата(scifi @ May 6 2016, 16:29) Предупр... May 7 2016, 16:57            scifi Цитата(Огурцов @ May 7 2016, 19:57) а не ... May 7 2016, 18:27          Tahoe Цитата(amiller @ May 6 2016, 17:19) 1. Ес... May 6 2016, 16:31           amiller Цитата(Tahoe @ May 6 2016, 19:31) Последн... May 7 2016, 02:52            Tahoe Цитата(amiller @ May 7 2016, 05:52) Предс... May 7 2016, 05:14             amiller Цитата(Tahoe @ May 7 2016, 08:14) Предста... May 7 2016, 05:37              svss Цитата(amiller @ May 7 2016, 11:37) ...
5... May 7 2016, 09:24               zltigo QUOTE (svss @ May 7 2016, 12:24) не полаг... May 7 2016, 10:25              Tahoe Цитата(amiller @ May 7 2016, 08:37) А кро... May 7 2016, 13:47               amiller Цитата(Tahoe @ May 7 2016, 16:47) Так мож... May 7 2016, 14:04                Tahoe Цитата(amiller @ May 7 2016, 17:04) сразу... May 7 2016, 16:06                 amiller Цитата(Tahoe @ May 7 2016, 19:06) Не поня... May 7 2016, 17:33          Сергей Борщ QUOTE (amiller @ May 6 2016, 17:19) 2. Од... May 6 2016, 21:37      halfdoom Цитата(amiller @ May 6 2016, 09:23) Если ... May 9 2016, 06:43       amiller Цитата(halfdoom @ May 9 2016, 09:43) Где-... May 9 2016, 07:54     GetSmart Цитата(Tahoe @ May 6 2016, 08:58) 3. Насч... May 9 2016, 16:00      zltigo QUOTE (GetSmart @ May 9 2016, 19:00) Ещё ... May 9 2016, 16:11 aiwa Вообще-то да, это работа не компилятора, но редакт... May 4 2016, 11:59 aiwa Цитата(amiller @ May 7 2016, 08:37) 2. ..... May 7 2016, 07:59 aiwa Цитата(Огурцов @ May 7 2016, 19:57) а не ... May 7 2016, 20:41 Огурцов вы можете между собой договориться, есть в предпис... May 7 2016, 21:59 aiwa Цитата(Огурцов @ May 8 2016, 00:59) вы мо... May 7 2016, 22:31 zltigo QUOTE (aiwa @ May 8 2016, 01:31) Причем, ... May 8 2016, 03:44 Огурцов Цитата(aiwa @ May 7 2016, 22:31) А о чем ... May 8 2016, 06:05  jcxz Цитата(Огурцов @ May 8 2016, 12:05) о сво... May 8 2016, 06:18   Огурцов > Выбросил 2+3, заменил на 5. Сообщать?
скорее ... May 8 2016, 06:53    jcxz Цитата(Огурцов @ May 8 2016, 12:53) >В... May 8 2016, 13:30     Огурцов Цитата(jcxz @ May 8 2016, 13:30) Каким бо... May 8 2016, 14:53  ViKo Цитата(Огурцов @ May 8 2016, 09:05) о сво... May 8 2016, 06:18   jcxz Цитата(ViKo @ May 8 2016, 12:18) У Кейла ... May 8 2016, 06:32    ViKo Цитата(jcxz @ May 8 2016, 09:32) IAR всё ... May 8 2016, 07:18 ViKo Прочитав тему еще раз, понял, что топикстартер при... May 8 2016, 05:55 amiller Цитата(ViKo @ May 8 2016, 08:55) Прочитав... May 8 2016, 09:07 ViKo Keil
Example1
CODE; generated by Component: ARM Co... May 8 2016, 10:35 aiwa Цитата(Огурцов @ May 8 2016, 09:05) о сво... May 8 2016, 12:13 amiller Цитата(aiwa @ May 8 2016, 15:13) Так он в... May 8 2016, 12:24 aiwa Цитата(zltigo @ May 8 2016, 06:44) Маразм... May 8 2016, 12:29 ViKo И во что же должно продвинуться беззнаковое uint16... May 8 2016, 12:34 aiwa Цитата(amiller @ May 8 2016, 15:24) Вроде... May 8 2016, 12:54 aiwa Цитата(jcxz @ May 8 2016, 16:30) Хмммм...... May 8 2016, 14:27 ViKo Правильно, продвигается до знакового целого. Но по... May 8 2016, 14:37 jcxz Цитата(ViKo @ May 8 2016, 20:37) Правильн... May 8 2016, 16:41  Огурцов Цитата(jcxz @ May 8 2016, 17:41) Ещё раз ... May 8 2016, 18:19   jcxz Цитата(Огурцов @ May 9 2016, 00:19) ещё р... May 9 2016, 08:59 aiwa Цитата(ViKo @ May 8 2016, 17:37) Правильн... May 8 2016, 14:43 ViKo О! Может, топикстартер все же напутал с опреде... May 8 2016, 14:45 amiller Цитата(ViKo @ May 8 2016, 17:45) О! М... May 8 2016, 15:04 aiwa Цитата(ViKo @ May 8 2016, 17:45) О! М... May 8 2016, 15:24 ViKo Почему никто не комментирует листинги от Кейла? Вс... May 8 2016, 15:45 aiwa Цитата(ViKo @ May 8 2016, 18:40) Почему н... May 8 2016, 15:53 ViKo Кейл, он же Кайл, он же Keil (нем.), он же куплен ... May 8 2016, 15:57 scifi Цитата(ViKo @ May 8 2016, 18:57) Кейл, он... May 8 2016, 16:43 jcxz Цитата(ViKo @ May 8 2016, 21:57) Кейл, он... May 8 2016, 17:00 aiwa Цитата(ViKo @ May 8 2016, 18:57) Кейл, он... May 8 2016, 16:20 ViKo Дополню для ясности. У Cortex-M команды - THUMB2 -... May 8 2016, 18:11 ViKo Таки да, операция ~temp1 дает число 0xFFFFFFFE. Во... May 8 2016, 19:42 aiwa Цитата(ViKo @ May 8 2016, 22:42) Таки да,... May 8 2016, 22:52 aiwa Цитата(halfdoom @ May 9 2016, 09:43) Пере... May 9 2016, 11:10 zltigo QUOTE (aiwa @ May 9 2016, 14:10) В резуль... May 9 2016, 11:56  svss Цитата(zltigo @ May 9 2016, 17:56) Если ... May 10 2016, 05:13 halfdoom Цитата(aiwa @ May 9 2016, 14:10) В резуль... May 9 2016, 14:51 aiwa Цитата(zltigo @ May 9 2016, 14:56) Если ... May 9 2016, 12:41 scifi Цитата(aiwa @ May 9 2016, 15:41) Вы вопро... May 9 2016, 12:49  jcxz Цитата(scifi @ May 9 2016, 18:49) Было бы... May 9 2016, 16:51 zltigo QUOTE (aiwa @ May 9 2016, 15:41) Вы вопро... May 9 2016, 13:38  dxp QUOTE (zltigo @ May 9 2016, 19:38) Python... May 9 2016, 16:29   zltigo QUOTE (dxp @ May 9 2016, 19:29) Питон - в... May 9 2016, 16:57    dxp QUOTE (zltigo @ May 9 2016, 22:57) Ага. Б... May 10 2016, 06:57  aiwa Цитата(halfdoom @ May 10 2016, 07:20) Ста... May 10 2016, 07:58   scifi Цитата(aiwa @ May 10 2016, 10:58) повторю... May 10 2016, 08:13   halfdoom Цитата(aiwa @ May 10 2016, 10:58) Все дов... May 10 2016, 08:49 aiwa Цитата(scifi @ May 10 2016, 11:13) Код, к... May 10 2016, 09:43
2 страниц
1 2 >
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|