Показать сообщение отдельно
Старый 24.08.2004, 11:14   #16  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Вот еще некоторые любопытные факты из жизни конвертации чисел в boolean, немножко проливающие свет на то что находится под капотом сего глюка:

PHP код:
static void Job4(Args _args)
{
    
boolean b;
    
real x;
    
int ij;
    ;
    
// Финт ушами №1, крест на явной конвертации real->boolean
    // хотя в language guide написано что всё должно быть пучком
    
0.7;
    
x;
    if ( 
info"TRUE" ); else info"FALSE" );
    if ( 
info"TRUE" ); else info"FALSE" );
    
    
// Финт ушами №2, принуждение к неявной конвертации спасает дело даже
    // если целью является явная ( a && true = a )
    
= -512;
    if ( 
info"TRUE" ); else info"FALSE" );
    
= -512 && true;
    if ( 
info"TRUE" ); else info"FALSE" );

    
// Финт ушами №3, немного проясняющий странность поведения явной конвертации 
    // чисел в boolean. boolean на самом деле оказывается байтом в котором
    // дамгардовцы пытаются сохранить нижние 8 бит исходного числа, что у них
    // плохо получается если это число - отрицательное
    
for ( 250<= 260i++ )
    {
        
i;
        
b;
        
infoint2str) + "->" + (b?"true":"false") + "->" int2str) );
    }
    for ( 
= -250>= -260i-- )
    {
        
i;
        
b;
        
infoint2str) + "->" + (b?"true":"false") + "->" int2str) );
    }

И всё становится ясно!

ВИДИМО где то в недрах интерпретатора Axapta присваивание переменной булевского типа использует следующий алгоритм конвертации (записано на языке C):

byte int2bool( int i )
{
return i > 255 ? 255 : i;
}

По вине разработчиков случай на i < 0 никак не обрабатывается, что приводит к урезанию ответа до последнего байта в этом случае и как следствие некорректному результату при i < 0 и кратных 256.