LINUX.ORG.RU

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

Исправление 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;