![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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