В двоичном обозначении дополнения минус числа - это дополнение плюс 1.
Когда foo.first() == true
, преобразуйте все оставшиеся элементы в двоичные цифры, затем инвертируйте его и добавьте 1. Затем верните отрицательный результат.
Итак, в вашем примере остальные элементы соответствуют двоичному числу 0000000
. Дополните это до 1111111
, что составляет 127
. Добавьте 1
, и вы получите 128
, а затем вернете -128
. И действительно, значение -128
представляется как 10000000
в 8-битном двоичном дополнении.
Тип данных со знаком, который вы используете для этого процесса, должен быть как минимум на 1 бит больше, чем размер вектора, чтобы избежать переполнения при добавлении 1 к значению «все биты установлены». Поэтому, если ваш вектор может содержать до 32 элементов (включая знак), вам нужно использовать int64_t
.