Приоритет побитовых операций

ioscat
Дата: 19.11.2014 13:34:04
Всем привет.

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

    // Объявляем два массива и инициализируем их    
    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


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

cmd
B[0] is: 0


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

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

cmd
B[0] is: 301
Anatoly Moskovsky
Дата: 19.11.2014 13:40:47
mayton
Дата: 19.11.2014 13:48:08
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.
ioscat
Дата: 19.11.2014 14:13:07
0xFA & 0x0F + 1 = 0x10

1111 1010
&
0000 1111 + 1 = 0001 0000
=
0001 0000mayton,
mayton
Дата: 19.11.2014 14:19:28
Я не про приоритет писал. У тебя unsigned char - какой длины?
ioscat
Дата: 19.11.2014 14:37:57
Я там добавил "(unsigned char)", всё ок должно быть, всё ОК и есть
ioscat
Дата: 19.11.2014 14:41:08
ioscat,

"(unsigned short)", конечно
Anatoly Moskovsky
Дата: 19.11.2014 14:42:15
mayton

В данном случае этой проблемы нет, поскольку правый операнд << - int, и для левого операнда типа char производится integer promotion до int.
SashaMercury
Дата: 19.11.2014 15:15:45
ioscat,
приоритет у оператора + выше чем у &. Вам ведь дали ссылку