Минус в беззнаковом целом в C++
Если случайно записать отрицательное число в
беззнаковый тип, ошибки не будет. Тип unsigned
не хранит минус, и в ячейке окажется другое,
уже положительное число.
Возьмем unsigned int и запишем в него -1:
unsigned int num = -1;
std::cout << num << "\n"; // выведет 4294967295
Так выходит из-за круга битов. У ячейки нет отдельных отрицательных значений. Шаг назад от нуля попадает на последнее число диапазона.
Удобно увидеть это на одном байте, 8 бит.
Беззнаковый байт хранит числа от 0 до 255.
Ноль в битах - это 00000000. Шаг назад включает
все восемь битов: 11111111. Это и есть 255.
Тип unsigned int устроен так же, только ячейка
длиннее: 4 байта, 32 бита. Ноль - это
тридцать два нуля. Минус один включает все биты.
Беззнаковое чтение этих битов дает 4294967295,
верхнюю границу диапазона.
Минус два - это еще один шаг назад. Последний бит
снова ноль, остальные единицы. На экране 4294967294:
unsigned int num = -2;
std::cout << num << "\n"; // выведет 4294967294
Дан следующий код:
unsigned int num = -3;
std::cout << num << "\n";
Скажите, соберется ли программа и какое число попадет на экран.
Дан следующий код:
unsigned int num = -5;
std::cout << num << "\n";
Скажите, какое число попадет на экран.
Беззнаковый байт хранит числа до 255. Какое
число получится, если в такой байт записать -1?