I have this C code(Is not for PC. Is 8bit microcontroller, CCS Compiler)
long SirenVolt;//unsigned int16
long long DummyVolt;//unsigned int32
DummyVolt=read_adc();//Function always get values from 0 to 1024
SirenVolt=(long long)((493*DummyVolt)/100);
The last line should be cast as long instead? I need that SirenVolt gets an unsigned int16(long, according the CCS Compiler)
CodePudding user response:
Should i cast different?
Yes, SirenVolt
is a long
and you cast to a long long
.
The default being unsigned
and long
being 16 bit is a bit confusing. It doesn't support unsigned int64
either.
From the chat:
read_adc()
function returns anunsigned int16
And since it returns max 1024
, this should work:
long SirenVolt = (long) (read_adc() * 493LL / 100);
If the compiler doesn't support LL
:
static const long long mul = 493;
static const long long div = 100;
long SirenVolt = (long) (read_adc() * mul / div);
read_adc() * mul
makes a long long
, max 504832
, divided by 100
max 5048
, fits fine in an unsigned int16
(the long
).