LINUX.ORG.RU

История изменений

Исправление quasimoto, (текущая версия) :

Не понял. Пусть будет вообще не size_t, а неограниченный nat_t, считаем, что байт восьмибитный — берём все пары чисел (x, y) : nat_t * nat_t таких, что x и y < 256, и получаем x * y < 256 (операция из Z/256Z) для каждой пары как (x * y) % 256 (операции из N). Потом берём эти x и y и преобразуем в byte(x) и byte (y) (< 256, так что никаких переполнений), так что byte(byte(x) * byte(y)) даёт ровно то же число (< 256, тут нет переполнения — работает остаток от деления по модулю, ищи в стандарте си или плюсов по слову «modulo», например «Unsigned integers, declared unsigned, shall obey the laws of arithmetic modulo 2 n where n is the number of bits in the value representation of that particular size of integer.»), что и (x * y) % 256.

То есть структура <byte, operator+, operator-, operator*> изоморфна структуре Z/256Z.

Структура <byte, operator+, operator-, operator*, operator/, operator%> изоморфна Z/256Z на которой определены функциональные отношения целочисленного деления и остатка от такого деления (и если выкинуть ноль, то тотальные функциональные отношения, то есть функции).

Также, на Z/256Z определено функциональное отношение деления как обратной операции к функции умножения — оно же определяется и на byte, так что опять получается изоморфизм структур.

Итого, везде используются функции и функциональные отношения, то есть «_один_ результат» и, в случае функций, «целая область определения», то есть вполне «определено _однозначно_». Если считать, что «не определено _однозначно_» это «более _одного_ результат» (строго нефункциональное отношение), то тут такого нет.

Для беззнаковых типов другой битности — аналогично.

Исходная версия quasimoto, :

Не понял. Пусть будет вообще не size_t, а неограниченный nat_t, считаем, что байт восьмибитный — берём все пары чисел (x, y) : nat_t * nat_t таких, что x и y < 256, и получаем x * y < 256 (операция из Z/256Z) для каждой пары как (x * y) % n (операции из N). Потом берём эти x и y и преобразуем в byte(x) и byte (y) (< 256, так что никаких переполнений), так что byte(byte(x) * byte(y)) даёт ровно то же число (< 256, тут нет переполнения — работает остаток от деления по модулю, ищи в стандарте си или плюсов по слову «modulo», например «Unsigned integers, declared unsigned, shall obey the laws of arithmetic modulo 2 n where n is the number of bits in the value representation of that particular size of integer.»), что и (x * y) % n.

То есть структура <byte, operator+, operator-, operator*> изоморфна структуре Z/256Z.

Структура <byte, operator+, operator-, operator*, operator/, operator%> изоморфна Z/256Z на которой определены функциональные отношения целочисленного деления и остатка от такого деления (и если выкинуть ноль, то тотальные функциональные отношения, то есть функции).

Также, на Z/256Z определено функциональное отношение деления как обратной операции к функции умножения — оно же определяется и на byte, так что опять получается изоморфизм структур.

Итого, везде используются функции и функциональные отношения, то есть «_один_ результат» и, в случае функций, «целая область определения», то есть вполне «определено _однозначно_». Если считать, что «не определено _однозначно_» это «более _одного_ результат» (строго нефункциональное отношение), то тут такого нет.

Для беззнаковых типов другой битности — аналогично.