vs2003 7.1.3038
От: vit_rsdn  
Дата: 30.11.06 07:23
Оценка:
такой код:

void main()
{
int sh = 188;// это неважно, главное чтоб было больше чем 32
int a = 4; // это тоже не важно, главно чтоб а не 0
if( a << sh )
{
printf( "asdf\n" );
}


}

попробуйте в релизе и дебаге.
У меня по разному.

Подскажите, так и должно быть ?
Re: vs2003 7.1.3038
От: Peregrin  
Дата: 30.11.06 10:10
Оценка:
Здравствуйте, 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 --------------------------------

Re: vs2003 7.1.3038
От: CreatorCray  
Дата: 30.11.06 10:59
Оценка:
Здравствуйте, 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, значит пора закрыть эту страницу.
Всем пока
Re[2]: vs2003 7.1.3038
От: CreatorCray  
Дата: 30.11.06 10:59
Оценка:
Здравствуйте, 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, значит пора закрыть эту страницу.
Всем пока
Re: vs2003 7.1.3038
От: CiViLiS Россия  
Дата: 30.11.06 17:17
Оценка: +1
Здравствуйте, 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>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.