Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.031 c
1-1108965228
Кир
2005-02-21 08:53
2005.03.06
TreeView разные ветки


14-1108368694
stone
2005-02-14 11:11
2005.03.06
Lord of The Rings: Battle for middle Earth


4-1106580207
Norny
2005-01-24 18:23
2005.03.06
Как узать, какая сейчас нажата клавиша?


4-1106433800
Unleashed
2005-01-23 01:43
2005.03.06
Setupdi функции


10-1085603284
-=alive=-
2004-05-27 00:28
2005.03.06
OPC





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский