Форум: "Основная";
Текущий архив: 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