the joys of C |
[Mar. 4th, 2016|06:11 pm] |
а вы знаете, что любой кусок кода, который содержит нижеследующее, может быть смело редуцирован в ничто?
unsigned char b; ... всякая фигня ... ...(b<<24) поясняю. «вдвигание» единицы в знаковый бит в цэ не определено. b по сишным правилам получает повышение до int. b может быть больше 0x7f. вуаля: undefined behavior. поэтому весь код до и после сдвига может быть смело выкинут компилятором на помойку, потому что его поведение тоже не определено. такое выкидывание не нарушает никаких правил и стандартов.
а мораль сей сказки простая: пойдите и поищите, нет ли у вас в коде такого сдвига без кастов в беззнаковое. есть? поздравляю, ваша программа — непортабельное дерьмо.
так что пишите на си, зайчики! видите, как легко на нём писать программы, которые потенциально можно оптимизировать в ноль инструкций? заодно можете спросить про этот код у очередного долбоёба, который начнёт вам рассказывать про «портабельность сишечки». потом смачно повозите его ебалом по его же говну и пиздюлями прогоните из своего дома. |
|
|
Comments: |
From: | (Anonymous) |
Date: | March 6th, 2016 - 03:48 am |
---|
| | | (Link) |
|
Спасибо, пошел искать бяку в своем коде.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 6th, 2016 - 12:35 pm |
---|
| | | (Link) |
|
заодно и ~0>>n можно вычистить (выдвигание из знакового бита тоже...), и любимую людьми реализацию циклосдвига: (value< [ Error: Irreparable invalid markup ('<count)|(value>') in entry. Owner must fix manually. Raw contents below.] заодно и ~0>>n можно вычистить (выдвигание из знакового бита тоже...), и любимую людьми реализацию циклосдвига: (value<<count)|(value>>(32-count)) -- тут сразу две жопы: сдвиг на 32 для инта размером 32 бита не определён, сдвиг на ноль в си тоже не определён. | |