Go Down

### Topic: bcdToDec and DecToBcd (Read 3024 times)previous topic - next topic

#### benl11235

##### Mar 16, 2013, 11:58 pm
Are the functions mentioned in the above predefined somewhere? I've seen a few programs referencing them, but never giving the definition. Could anyone point me to some code for them? I'd love to see how they work.

#### guix

#1
##### Mar 17, 2013, 12:32 amLast Edit: Mar 17, 2013, 12:34 am by guix Reason: 1
Hello and welcome

Here are the functions:

Code: [Select]
`uint8_t decToBcd( int val ){    return (uint8_t) ((val / 10 * 16) + (val % 10));} uint8_t bcdToDec( uint8_t val ){    return (uint8_t) ((val / 16 * 10) + (val % 16));}`

#### benl11235

#2
##### Mar 17, 2013, 12:48 am
Could you explain a little bit about how they work? They both return a uint8_t[byte], I'm a bit confused about the calculation that just seems to be floating out there. Is that legal? Will those work on non single digit numbers, like say 42.  I think I understand the BCD format, I'm just not sure I understand the syntax

#### guix

#3
##### Mar 17, 2013, 02:50 am
Sorry, I have never used these functions, I just found them and pasted them here.

I too don't understand how they work, as I understand the decToBcd should convert for example 9 into 1001, which is greater than a byte...

Maybe someone with more knowledge could reply?

#### Henry_Best

#4
##### Mar 17, 2013, 06:22 am

Sorry, I have never used these functions, I just found them and pasted them here.

I too don't understand how they work, as I understand the decToBcd should convert for example 9 into 1001, which is greater than a byte...

A byte is 8 binary digits. 1001 is only four binary digits (a nibble) any you can count from
0 - 15 with a nibble (8 + 4 + 2 + 1 = 15).

#### guix

#5
##### Mar 17, 2013, 07:30 am
The max value of a byte is 255, so 1001 doesn't fit in it... but anyway, I don't understand what these functions do ( I tried to print the result of decToBcd( 9 ) and it printed 9...)

#### michinyon

#6
##### Mar 17, 2013, 10:05 am
An unsigned 8-bit  int is a byte which will hold 256 distinct values,  which represent
the values 0 to 255.

If it was a signed 8-bit int,   the same 256 possible bit patterns would be taken
to represent the numbers -128 to +127.

In "Binary coded decimal",   there are two separate four-bit numbers in each byte.
The decimal digits 0..9  are represented by a four-bit binary number from 0000 to 1001
in the normal binary number scheme  (  the same as hexadecimal ),  except that the
four remaining bit patterns (  which in hexadecimal represent the digits A to F ( ten to fifteen ) ),
are not used for anything.

In Binary coded decimal arithmetic,   you can do decimal arithmetic.

It is not as efficient in space usage as binary schemes,  a single byte can only have the
value 00 to 99  so 99 different numbers instead of 256 different numbers.

But it was used in many early computers and for some other uses like pocket calculators
and spacecraft

#### michinyon

#7
##### Mar 17, 2013, 10:08 am
So if you have unsigned 8-bit numbers  and you have the number     00100101  in binary  which is 37  then
you convert it to BCD  then you will have 00110111  which is 0011 ( 3)  and 0111 (7)  in two separate half-bytes.
And you can have simple functions which convert one to the other and back again,  provided the numbers
are in the acceptable range.

Go Up