powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Приоритет побитовых операций
9 сообщений из 9, страница 1 из 1
Приоритет побитовых операций
    #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
Приоритет побитовых операций
    #38810729
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Приоритет побитовых операций
    #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
Приоритет побитовых операций
    #38810776
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
0xFA & 0x0F + 1 = 0x10

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

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

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


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