C++: выражение -1u % 256

Aug 03, 2023 21:14

Начало:
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

Образование, Программирование, Математика, Школа

Previous post Next post
Up