www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2002/09/23/11:42:32

Message-ID: <3D8EA8B0.F4EA56@yahoo.com>
From: CBFalconer <cbfalconer AT yahoo DOT com>
Organization: Ched Research
X-Mailer: Mozilla 4.75 [en] (Win98; U)
X-Accept-Language: en
MIME-Version: 1.0
Newsgroups: comp.os.msdos.djgpp
Subject: Re: Problem with multiplications
References: <M2%i9.25731$Av4 DOT 488132 AT twister2 DOT libero DOT it>
Lines: 27
Date: Mon, 23 Sep 2002 14:51:39 GMT
NNTP-Posting-Host: 12.90.173.92
X-Complaints-To: abuse AT worldnet DOT att DOT net
X-Trace: bgtnsc05-news.ops.worldnet.att.net 1032792699 12.90.173.92 (Mon, 23 Sep 2002 14:51:39 GMT)
NNTP-Posting-Date: Mon, 23 Sep 2002 14:51:39 GMT
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

Carlo Bramini wrote:
> 
> I have a problem with DJGPP, but I'm going to think it's common with all
> i386 target versions of this compiler.
> I have two 32 bit numbers and I want to do:
> 
> c = (a*b) >> 32;
> 
> for getting the upper 32 bit DWORD.
> Unfortunately, it doesn't work!
... snip ...

You need to ensure your numbers never overflow a 32 bit value.  So
break the input up into 16 bit components, so that a = (a1 << 16)
+ a2 and b = (b1 << 16) + b2, and do your arithmetic on the 16 bit
components.  You will have to devise a way of combining them into
a 64 bit value, which will probably be some sort of byte array. 
Watch out for signs.

An easier method is to just use a bignum package.

-- 
Chuck F (cbfalconer AT yahoo DOT com) (cbfalconer AT worldnet DOT att DOT net)
   Available for consulting/temporary embedded and systems.
   <http://cbfalconer.home.att.net>  USE worldnet address!


- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019