Я знаю, что это старый вопрос, но, возможно, кто-то может использовать это решение:
int size = 0; // Fill all bits with zero (0)
size = ~size; // Negate all bits, thus all bits are set to one (1)
Пока у нас есть -1 как результат 'до размер является подписанным int.
size = (unsigned int)size >> 1; // Shift the bits of size one position to the right.
Как сказано в стандарте, сдвинутые биты равны 1, если переменная подписана, и отрицательны, и 0, если переменная будет без знака или со знаком, и положительна.
Поскольку size подписан и отрицателен, мы будем сдвигать знаковый бит, который равен 1, что не очень помогает, поэтому мы приводим к unsigned int, заставляя вместо этого сдвигать в 0, устанавливая бит знака в 0, оставляя все остальные биты равными 1.
cout << size << endl; // Prints out size which is now set to maximum positive value.
Мы могли бы также использовать маску и xor, но тогда мы должны были знать точный размер переменной в битах. Смещая фронт битов, мы не должны знать, сколько битов int имеет на машине или компиляторе, и не должны включать дополнительные библиотеки.