Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Приоритет побитовых операций / 9 сообщений из 9, страница 1 из 1
19.11.2014, 13:34
    #38810721
ioscat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приоритет побитовых операций
Всем привет.

Столкнулся с непоняшкой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    // Объявляем два массива и инициализируем их    
    unsigned char A[5]={0xFF, 0x03, 0x00, 0x00, 0xB6};
    unsigned short B[4]={0};
 
   
    // Смотрим, что внутри
    cout << (unsigned short)A[0] << " " ;
    cout << hex << (unsigned short)A[0] << endl;
   
    cout << (unsigned short)A[1] << " " ;
    cout << hex << (unsigned short)A[1] << endl;
   
    // Пробуем провернуть операцию:
    B[0]=(A[1]<<8)&0x3FF ;
    cout << " B[0] is: " << B[0] << endl;


cmd B[0] is: 300

А теперь немного изменим код:
Код: plaintext
1.
B[0]=(A[1]<<8)&0x3FF[color=red] + 1[/color];


cmd B[0] is: 0

Вопрос - с чего вдруг так, по идее должно быть 301!

Если добавить скобок, то всё ОК:
Код: plaintext
1.
B[0]=((A[1]<<8)&0x3FF) + 1[/color];


cmd B[0] is: 301
...
Рейтинг: 0 / 0
19.11.2014, 13:40
    #38810729
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приоритет побитовых операций
...
Рейтинг: 0 / 0
19.11.2014, 13:48
    #38810737
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приоритет побитовых операций
http://en.wikipedia.org/wiki/Logical_shift All currently relevant C standards (ISO/IEC 9899:1999 to 2011) leave a definition gap for cases where the number of shifts is equal to or bigger than the number of bits in the operands in a way that the result is simply undefined. This helps allow C compilers emit efficient code for various platforms by allowing direct use of the native shift instructions which have differing behavior. For example, shift-left-word in PowerPC

chooses the more-intuitive behavior where shifting by the bit width or above gives zero, whereas SHL in x86

chooses to mask the shift amount to the lower bits "to reduce the maximum execution time of the instructions", and as such a shift by the bit width doesn't change the value.
...
Рейтинг: 0 / 0
19.11.2014, 14:13
    #38810776
ioscat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приоритет побитовых операций
0xFA & 0x0F + 1 = 0x10

1111 1010
&
0000 1111 + 1 = 0001 0000
=
0001 0000mayton,
...
Рейтинг: 0 / 0
19.11.2014, 14:19
    #38810792
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приоритет побитовых операций
Я не про приоритет писал. У тебя unsigned char - какой длины?
...
Рейтинг: 0 / 0
19.11.2014, 14:37
    #38810812
ioscat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приоритет побитовых операций
Я там добавил "(unsigned char)", всё ок должно быть, всё ОК и есть
...
Рейтинг: 0 / 0
19.11.2014, 14:41
    #38810814
ioscat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приоритет побитовых операций
ioscat,

"(unsigned short)", конечно
...
Рейтинг: 0 / 0
19.11.2014, 14:42
    #38810815
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приоритет побитовых операций
mayton

В данном случае этой проблемы нет, поскольку правый операнд << - int, и для левого операнда типа char производится integer promotion до int.
...
Рейтинг: 0 / 0
19.11.2014, 15:15
    #38810862
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приоритет побитовых операций
ioscat,
приоритет у оператора + выше чем у &. Вам ведь дали ссылку
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Приоритет побитовых операций / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]