Главная страница
    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.037 c
14-1108366803
Sapsi
2005-02-14 10:40
2005.03.06
Уровень общей культуры в России и других странах


14-1108449697
Чайнище
2005-02-15 09:41
2005.03.06
Алгоритм генератора?


1-1108637057
Fay
2005-02-17 13:44
2005.03.06
Странно разворачивается MDI-форма в WinXP


1-1109014346
Jilian
2005-02-21 22:32
2005.03.06
Проблема с Image


3-1107510585
Shama_n
2005-02-04 12:49
2005.03.06
Трехзвенка + SQL





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