Вот еще некоторые любопытные факты из жизни конвертации чисел в boolean, немножко проливающие свет на то что находится под капотом сего глюка:
PHP код:
static void Job4(Args _args)
{
boolean b;
real x;
int i, j;
;
// Финт ушами №1, крест на явной конвертации real->boolean
// хотя в language guide написано что всё должно быть пучком
x = 0.7;
b = x;
if ( b ) info( "TRUE" ); else info( "FALSE" );
if ( x ) info( "TRUE" ); else info( "FALSE" );
// Финт ушами №2, принуждение к неявной конвертации спасает дело даже
// если целью является явная ( a && true = a )
b = -512;
if ( b ) info( "TRUE" ); else info( "FALSE" );
b = -512 && true;
if ( b ) info( "TRUE" ); else info( "FALSE" );
// Финт ушами №3, немного проясняющий странность поведения явной конвертации
// чисел в boolean. boolean на самом деле оказывается байтом в котором
// дамгардовцы пытаются сохранить нижние 8 бит исходного числа, что у них
// плохо получается если это число - отрицательное
for ( i = 250; i <= 260; i++ )
{
b = i;
j = b;
info( int2str( i ) + "->" + (b?"true":"false") + "->" + int2str( j ) );
}
for ( i = -250; i >= -260; i-- )
{
b = i;
j = b;
info( int2str( i ) + "->" + (b?"true":"false") + "->" + int2str( j ) );
}
}
И всё становится ясно!
ВИДИМО где то в недрах интерпретатора Axapta присваивание переменной булевского типа использует следующий алгоритм конвертации (записано на языке C):
byte int2bool( int i )
{
return i > 255 ? 255 : i;
}
По вине разработчиков случай на i < 0 никак не обрабатывается, что приводит к урезанию ответа до последнего байта в этом случае и как следствие некорректному результату при i < 0 и кратных 256.