Сообщение Re[23]: Carbon от 21.04.2024 10:54
Изменено 21.04.2024 10:55 kov_serg
Re[23]: Carbon
Здравствуйте, Sinclair, Вы писали:
S>Давайте попробуем починить UB в функции, написанной просто и строго по делу, безо всяких шаблонов:
S>
Часть переполнение можно убрать заменив одни UB на другие
S>Давайте попробуем починить UB в функции, написанной просто и строго по делу, безо всяких шаблонов:
S>
S>long avg(long a, long b, long c)
S>{
S> return (a+b+c)/3;
S>}
S>
Часть переполнение можно убрать заменив одни UB на другие
long avg(long a,long b,long c) {
long r1=(a>>2)+(b>>2)+(c>>2), r2=r1%3;
r1-=r2; r2=4*r2+(a&3)+(b&3)+(c&3);
if (r1<0 && r2>0) { r2-=12; r1++; }
r1/=3; r2/=3; return (r1<<2)+r2;
}
Re[23]: Carbon
Здравствуйте, Sinclair, Вы писали:
S>Давайте попробуем починить UB в функции, написанной просто и строго по делу, безо всяких шаблонов:
S>
Переполнение можно убрать, заменив одни UB на другие
S>Давайте попробуем починить UB в функции, написанной просто и строго по делу, безо всяких шаблонов:
S>
S>long avg(long a, long b, long c)
S>{
S> return (a+b+c)/3;
S>}
S>
Переполнение можно убрать, заменив одни UB на другие
long avg(long a,long b,long c) {
long r1=(a>>2)+(b>>2)+(c>>2), r2=r1%3;
r1-=r2; r2=4*r2+(a&3)+(b&3)+(c&3);
if (r1<0 && r2>0) { r2-=12; r1++; }
r1/=3; r2/=3; return (r1<<2)+r2;
}