Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

integer overflow error - почему? [D7, WinXP]


wingman ©   (2005-02-19 23:17:00) 

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

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-21 02:38:00) [1]

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


wingman   (2005-02-21 02:34:00) [2]

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


begin...end   (2005-02-20 20:39:00) [3]

> 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-20 19:57:00) [4]

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


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

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

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,
ну что за =(((
из-за чего такое может быть, никак не воткну... =(


Sam Stone   (2005-02-20 12:13:00) [6]

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо