История изменений
Исправление firkax, (текущая версия) :
Определено это значит зная исходные данные, имеем полностью предсказуемый и строго заданный любым из существующих стандартов один и тот же ответ.
Нет, это не бессмысленное значение. Просто оторвись от понимания компьютерного вычитания как «математического с дефектами», и прими это как самостоятельную операцию. Да, она зависит от разрядности. В Си вообще много чего зависит от разрядности, это не скриптовый язык.
разности двух uint к более длинному uint - некорректно. некорректно потому, что обратная операция - прибавление двойки не даст 1, поскольку на длинном uint переполнения не будет.
Всё корректно, надо просто понимать что ты делаешь и не иметь ложных ожиданий что оно как-нить само приведётся к тому что у тебя в голове.
на интах всегда будет работать обратная операция(сложение вычитаемого и результата), на беззнаковых, при преобразовании в резульата в длинный беззнаковый - нет.
Во-первых, никаких «при». Тайпкаст - это тоже операция, она не всегда может быть переставлена местами с чем-то ещё просто так. Во-вторых, с интами тоже не будет нормально работать если в середину всунуть тайпкаст.
int32 a = (int32)(-0x7FFFFFFF) - (int32)2;
int64 b = (int64)a + 2;
итогом будет либо UB (-fstrict-overflow) либо 0x80000001 (-fno-strict-overflow) но нигде не -0x7FFFFFFF. Разница с unsigned только в том, что в нём не будет UB ни при каких флагах компилятора, а всегда будет wrap-нутое значение с другого конца диапазона.
Исходная версия firkax, :
Определено это значит зная исходные данные, имеем полностью предсказуемый и строго заданный любым из существующих стандартов один и тот же ответ.
Нет, это не бессмысленное значение. Просто оторвись от понимания компьютерного вычитания как «математического с дефектами», и прими это как самостоятельную операцию. Да, она зависит от разрядности. В Си вообще много чего зависит от разрядности, это не скриптовый язык.
разности двух uint к более длинному uint - некорректно. некорректно потому, что обратная операция - прибавление двойки не даст 1, поскольку на длинном uint переполнения не будет.
Всё корректно, надо просто понимать что ты делаешь и не иметь ложных ожиданий что оно как-нить само приведётся к тому что у тебя в голове.
на интах всегда будет работать обратная операция(сложение вычитаемого и результата), на беззнаковых, при преобразовании в резульата в длинный беззнаковый - нет.
Во-первых, никаких «при». Тайпкаст - это тоже операция, она не всегда может быть переставлена местами с чем-то ещё просто так. Во-вторых, с интами тоже не будет нормально работать если в середину всунуть тайпкаст.
int32 a = (int32)(-0x7FFFFFFF) - (int32)2;
int64 b = (int64)a + 2;
итогом будет либо UB (-fstrict-overflow) либо 0x80000001 (-fno-strict-overflow) но нигде не -0x7FFFFFFF