2 бита влево получается 4 а не 260?
char f = 'A';
char f2 = f << 2;
char f3 = f2 >> 2;
cout << (int)f << " " << (int)f2 << " " << (int)f3 << endl;
результат: 65 4 1
Смещение знакового типа это Implementation Defined(я почти уверен что у автора char знаковый)
емнип границы чара меньше чем 260, поэтому у тебя фигня и получается
Потому что f у вас не может быть больше 127, потому 4. Но вообще так нельзя делать, верно заметили, это зависит от компилятора.
f может быть больше 127
В десятичном предоставлении
то уже unsigned char будет, не?
А с каких пор impl defined?
А с каких пор нет?
C 98 года
-funsigned-char(gcc)
For signed and non-negative a, if a * 2b is representable in the unsigned version of the return type, then that value, converted to signed, is the value of a << b (this makes it legal to create INT_MIN as 1<<31); otherwise the behavior is undefined. For negative a, the behavior of a << b is undefined. https://en.cppreference.com/w/cpp/language/operator_arithmetic
C 20 стандарта там вообще убрали УБ для негативных
Обсуждают сегодня