>> 127
означает сдвиг крайних правых 127 бит в числе. Поскольку ваш uint128_t равен 0x1234 ...., самый значимый бит - это «0». После a >>= 127
число становится равным 0, поэтому на выходе получается 0 0
, как и ожидалось.
Что касается <<=
, это потому, что
uint128_t & operator=(uint128_t & rhs)
не соответствует значению rhs
, а
template <typename T> uint128_t & operator=(T rhs)
соответствует, когда T == uint128_t
также, поэтому в
*this = *this << shift;
будет выбран оператор присваивания шаблона, который назначает только нижний uint64_t. Вы должны изменить подпись первого правопреемника оператора на
uint128_t& operator=(const uint128_t& rhs)
// ^^^^^