Здравствуйте, vit_rsdn, Вы писали:
_>такой код:
_>void main()
_>{
_> int sh = 188;// это неважно, главное чтоб было больше чем 32
_> int a = 4; // это тоже не важно, главно чтоб а не 0
_> if( a << sh )
_> {
_> printf( "asdf\n" );
_> }
_>}
_>попробуйте в релизе и дебаге.
_>У меня по разному.
_>Подскажите, так и должно быть ?
У меня при компиляции с /O2 ничего не выводится. При запуске под отладчиком видно, что компилятор скомпилировал этот код вот в такое:
--- d:\cpp\vc7bugs\test1.cpp ---------------------------------------------------
#include <stdio.h>
void main()
{
int sh = 188;// это неважно, главное чтоб было больше чем 32
int a = 4; // это тоже не важно, главно чтоб а не 0
if( a << sh )
{
printf( "asdf\n" );
}
}
00401010 xor eax,eax
00401012 ret
--- f:\vs70builds\6030\vc\crtbld\crt\src\crt0.c --------------------------------
Здравствуйте, vit_rsdn, Вы писали:
_>такой код:
_>void main()
_>{
_> int sh = 188;// это неважно, главное чтоб было больше чем 32
_> int a = 4; // это тоже не важно, главно чтоб а не 0
_> if( a << sh )
_> {
_> printf( "asdf\n" );
_> }
Исходя из логики работы shl a,b на железе:
a <<= (b & 31)
компилер должен соптимизить условие в:
true если (b & 31) < 30
false если (b & 31) >= 30
Что и наблюдаем на ICC9.1
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Peregrin, Вы писали:
P>У меня при компиляции с /O2 ничего не выводится. При запуске под отладчиком видно, что компилятор скомпилировал этот код вот в такое:
P>P>--- d:\cpp\vc7bugs\test1.cpp ---------------------------------------------------
P>#include <stdio.h>
P>void main()
P>{
P> int sh = 188;// это неважно, главное чтоб было больше чем 32
P> int a = 4; // это тоже не важно, главно чтоб а не 0
P> if( a << sh )
P> {
P> printf( "asdf\n" );
P> }
P>}
P>00401010 xor eax,eax
P>00401012 ret
P>--- f:\vs70builds\6030\vc\crtbld\crt\src\crt0.c --------------------------------
P>
Оптимизатор IMHO в вижуалке на сдвигах неверно отрабатывает.
Должно быть иначе.
этот код должен быть эквивалентен:
int sh = 188;
int a = 4;
if( a << (sh & 31) )
{
printf( "asdf\n" );
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, vit_rsdn, Вы писали:
_>такой код:
_>void main()
_>{
_> int sh = 188;// это неважно, главное чтоб было больше чем 32
_> int a = 4; // это тоже не важно, главно чтоб а не 0
_>}
Выделенное как раз важно. Стандарт (пунк 5.8 )говорит что при этом условии UB, поэтому компилеры реализуют как хотят.
The behavior is undefined if the rigth operand is negative, or greater than or equal to the length in bits of the promoted left operand.
... << RSDN@Home 1.2.0 alpha rev. 655>>