Notice, the result for `b << 0` and `c << 0` is wrong. It should be 18446744073709551615.
The problem happens because Field_double::val_int() and Field_new_decimal::val_int() truncate to max signed bigint value.
It's not easy to fix this in the current code base.
It seems we need to change this Field and Item method:
so the underlying Field or Item can return the entire range -9223372036854775808 .. 18446744073709551615, i.e. from the minimum possible SIGNED value to maximum possible UNSIGNED value.