Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.06;
Скачать: CL | DM;

Вниз

integer overflow error - почему?   Найти похожие ветки 

 
wingman   (2005-02-19 23:17) [0]

перевожу известный сишный код ::

DWORD VectortoRGBA( D3DXVECTOR3* v, FLOAT fHeight )
{
   DWORD r = (DWORD)( 127.0f * v->x + 128.0f );
   DWORD g = (DWORD)( 127.0f * v->y + 128.0f );
   DWORD b = (DWORD)( 127.0f * v->z + 128.0f );
   DWORD a = (DWORD)( 255.0f * fHeight );
   
   return( (a<<24L) + (r<<16L) + (g<<8L) + (b<<0L) );
}

вот в такое ::

function VectortoRGBA(const v :TD3DXVector3; fHeight :single) :dword;
begin
   r:=dword(round(127.0*v.x+128.0));
   g:=dword(round(127.0*v.y+128.0));
   b:=dword(round(127.0*v.z+128.0));
   a:=dword(round(255.0*fHeight));

   result:=(a shl 24) + (r shl 16) + (g shl 8) + (b shl 0);
end;

что и где я делаю не так ?
почему переполнение целого ?


 
wingman   (2005-02-19 23:21) [1]

ой, простите, забыл, переполнение наступает в случае, если fHeight>0.5


 
Sam Stone ©   (2005-02-20 12:13) [2]

Лично у меня переполнение появилось только при 1.999 :\
Все просто: числа больше 255 занимают 2 байта =9 и более битов. Сдвиг на 24 дает 33 более разряда, в то время как dword = longword = 32 unsigned 32-bit
Используй Int64


 
wingman   (2005-02-20 19:55) [3]

ничего не понимаю, ну вот еще функция, перевод строки хексов в целое -

function HexToInt(vHexString :string) :int64;
var
 _count          : integer;
 num             : dword;
begin
 result:=0;

 for _count:=Length(vHexString) downto 1 do
     begin
       case vHexString[_count] of
            "A", "a" : num:=10;
            "B", "b" : num:=11;
            "C", "c" : num:=12;
            "D", "d" : num:=13;
            "E", "e" : num:=14;
            "F", "f" : num:=15;
            else if (not (vHexString[_count] in ["0".."9"]))
                     then begin
                            result:=0;
                            exit
                          end else num:=strtoint(vHexString[_count]);
       end;
       inc(result, num*(1 shl ((Length(vHexString)-_count)*4)));
     end;
end;

число больше $7f000000 дает нормальный результат,
если $8f000000 или больше - overflow,
ну что за =(((
из-за чего такое может быть, никак не воткну... =(


 
wingman   (2005-02-20 19:57) [4]

фу, черт, опять напутал, все до $7f000000 - нормально, а вот $8f000000 или больше - переполнение


 
begin...end ©   (2005-02-20 20:39) [5]

> wingman   (20.02.05 19:55) [3]

> inc(result, num*(1 shl ((Length(vHexString)-_count)*4)))

inc(result, num*(Int64(1) shl ((Length(vHexString)-_count)*4)))

Правда, непонятно, зачем нужна эта функция при наличии стандартной StrToInt64 (она тоже работает и с шестнадцатеричным представлением чисел).


 
wingman   (2005-02-21 02:34) [6]

begin...end,
зачем единицу кастовать?
да и все равно переполнение ... все операнды кастую - все равно переполнение
эх


 
wingman   (2005-02-21 02:38) [7]

все, прошу прощения у всех, проблема была локализована,
спасибо за помощь =)



Страницы: 1 вся ветка

Текущий архив: 2005.03.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.038 c
14-1107967766
Pat
2005-02-09 19:49
2005.03.06
Повешанье люстры :) Нужен совет


6-1103884743
AlexG
2004-12-24 13:39
2005.03.06
Какую библтотеку использовать?


4-1106224117
Дмитрий Ботвин
2005-01-20 15:28
2005.03.06
Изменение свойств файлов


3-1107796391
MakedoneZ
2005-02-07 20:13
2005.03.06
TDBGrid и Table


1-1109234508
Brain Force
2005-02-24 11:41
2005.03.06
Как получить текущую позицию курсора мыши