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

 
 
> Битовые сдвиги
CSB
сообщение Jun 17 2006, 15:01
Сообщение #1


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

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



Код

#include <iom8.h>

void main(void)
{
    unsigned long int a, n;

    n = 16;
    a = 1 << n;
    PORTB = a;
}

По идее в переменной "а" должен быть установлен 16 бит, а на деле там 0. Какие есть идеи?

Компилятор:
IAR C/C++ Compiler for AVR
4.12A/W32 [Evaluation] (4.12.1.3)

Для просмотра значений переменных использую родной симулятор.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
CSB
сообщение Jun 17 2006, 16:45
Сообщение #2


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

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



В ассемблере у меня получается две команды: очистка регистров и все!

Оптимизация: переключатель в положении "скорость", в списке выбрано None (Best debug support).

Кроме того получается разный результат при
a = 1ULL << 7;
и
n = 7;
a = 1ULL << n;
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 17 2006, 17:14
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(CSB @ Jun 17 2006, 19:45) *
В ассемблере у меня получается две команды: очистка регистров и все!
Оптимизация: переключатель в положении "скорость", в списке выбрано None (Best debug support).
Кроме того получается разный результат при
a = 1ULL << 7;
и
n = 7;
a = 1ULL << n;
Что-то не так. Приведи весь код. Вот что получается у меня:
Код
volatile int a;
void main (void) {
    int n = 7;
    a = 1ULL << 7;
    a = 1ULL << n;
}
     19          void main (void) {
   \                     main:
   \   00000000   939A               ST      -Y, R25
   \   00000002   938A               ST      -Y, R24
     20              int n = 7;
     21              a = 1ULL << 7;
   \   00000004   E800               LDI     R16, 128
   \   00000006   E010               LDI     R17, 0
   \   00000008   ....               LDI     R30, LOW(a)
   \   0000000A   ....               LDI     R31, (a) >> 8
   \   0000000C   8300               ST      Z, R16
   \   0000000E   8311               STD     Z+1, R17
     22              a = 1ULL << n;
   \   00000010   8300               ST      Z, R16
   \   00000012   8311               STD     Z+1, R17
Результат одинаковый.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 07:49
Рейтинг@Mail.ru


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