Начало:
1.
С++: математика целочисленного деления с остатком2.
С++: математика целочисленного деления с остатком, ч.2 В современных версиях языка программирования C++ операция взятия остатка от целочисленного деления числа -1 на число 256 дает результат -1. Например:
#include
int main()
{
std::cout << -1 % 256 << '\n'; // -1
return 0;
}
И тут мне показали следующее:
std::cout << -1u % 256 << '\n'; // 255
Вопрос: почему выражение -1u % 256 выдает результат 255?
Ответ
Суффикс в виде латинской буквы u или U в конце числового литерала в C++ означает, что данный числовой литерал имеет целочисленный тип без знака (unsigned). Однако, этому противоречит знак минуса в начале числового литерала. Компилятор разрешает это противоречие с помощью модульного оборота (у меня про это понятие есть
отдельный пост), в результате чего числовой литерал -1u интерпретируется следующим образом:
-1u --> 4'294'967'295 (если речь идет про 4-байтовое целое без знака)
Напомню, 4-байтовое целое без знака имеет диапазон возможных значений от 0 по 4'294'967'295 включительно (всего 2^32 = 4'294'967'296 значений).
Таким образом, получается следующее:
-1u % 256 --> 4'294'967'295 % 256 --> 255