История изменений
Исправление
kvpfs,
(текущая версия)
:
По-моему, твой кейс весьма безобиден, гораздо большую проблему представляет смешанная арифметика (где в одном выражении есть знаковые и беззнаковые), результат может зависеть от «расстановки скобочек» в то время как сами операторы в выражении ассоциативны:
int i = 2;
unsigned u = 1;
long l = 1;
assert(u-i+l != u+l-i);
Хз, почему-то так вышло, но integer promotion всегда кастует в int и нет никаких особых правил для смешанных операций. Всегда использую -Wsign-conversion, а в нужных местах делаю вручную каст таким костыльком:
template <integral T>
auto scvt(T t)
{
using type_t = conditional_t<is_signed_v<T>,
uintmax_t, intmax_t>;
return static_cast<type_t>(t);
}
assert(scvt(u)-i+l == scvt(u)+l-i);
scvt(i) + u;
Исправление
kvpfs,
:
По-моему, твой кейс весьма безобиден, гораздо большую проблему представляет смешанная арифметика (где в одном выражении есть знаковые и беззнаковые), результат может зависеть от «расстановки скобочек» в то время как сами операторы в выражении ассоциативны:
int i = 2;
unsigned u = 1;
long l = 1;
assert(u-i+l != u+l-i);
Хз, почему-то так вышло, но integer promotion всегда кастует в int и нет никаких особых правил для смешанных операций. Всегда использую -Wsign-conversion, а в нужных местах делаю вручную каст таким костыльком:
template <std::integral T>
auto scvt(T t)
{
using type_t = conditional_t<is_signed_v<T>,
uintmax_t, intmax_t>;
return static_cast<type_t>(t);
}
assert(scvt(u)-i+l == scvt(u)+l-i);
scvt(i) + u;
Исходная версия
kvpfs,
:
По-моему, твой кейс весьма безобиден, гораздо большую проблему представляет смешанная арифметика (где в одном выражении есть знаковые и беззнаковые), результат может зависеть от «расстановки скобочек» в то время как сами операторы в выражении ассоциативны:
int i = 2;
unsigned u = 1;
long l = 1;
assert(u-i+l != u+l-i);
Хз, почему-то так вышло, но integer promotion всегда кастует в int и нет никаких особых правил для смешанных операций. Всегда использую -Wsign-conversion, а в нужных местах делаю вручную каст таким костыльком:
template <std::integral T>
auto scvt(T t)
{
using type_t = std::conditional_t<std::is_signed_v<T>,
std::uintmax_t, std::intmax_t>;
return static_cast<type_t>(t);
}
assert(scvt(u)-i+l == scvt(u)+l-i);
scvt(i) + u;