Главная страница
    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.46 MB
Время: 0.03 c
14-1108374226
Ozone
2005-02-14 12:43
2005.03.06
Учет трафика пользователей


3-1105676012
Lelik
2005-01-14 07:13
2005.03.06
Импорт таблиц dbf в Access


1-1108739359
DimonNew
2005-02-18 18:09
2005.03.06
Как можно связать обычные компонеты с наборами данных


11-1092577936
SSSSS
2004-08-15 17:52
2005.03.06
Canvas и компания....


14-1108102012
MBo
2005-02-11 09:06
2005.03.06
Пятничная разминка заскорузлых нейронов и аксонов :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский