Thread: Unsigned 64 bit integer to numeric
Hi, Probably a simple question, but I don't see a simple answer so far. In one extension I want to convert uint64 into a numeric to put it eventually into a jsonb object. As far as I see in numeric.c there are functions only for signed int64. Is there a way to achive this with uint64 (without duplicating significant part of numeric implementation in the extension)?
Hi,
I don't think so, but there's an (unmaintained?) uint extension at
On Wed, Dec 4, 2019 at 11:24 AM Dmitry Dolgov <9erthalion6@gmail.com> wrote:
Hi,
Probably a simple question, but I don't see a simple answer so far. In
one extension I want to convert uint64 into a numeric to put it
eventually into a jsonb object. As far as I see in numeric.c there are
functions only for signed int64. Is there a way to achive this with
uint64 (without duplicating significant part of numeric implementation
in the extension)?
>>>>> "Dmitry" == Dmitry Dolgov <9erthalion6@gmail.com> writes: Dmitry> Hi, Dmitry> Probably a simple question, but I don't see a simple answer so Dmitry> far. In one extension I want to convert uint64 into a numeric Dmitry> to put it eventually into a jsonb object. As far as I see in Dmitry> numeric.c there are functions only for signed int64. Is there a Dmitry> way to achive this with uint64 (without duplicating significant Dmitry> part of numeric implementation in the extension)? Sure. Flip the top bit; convert the value as if signed; then subtract -(2^63) from the result. (Easier to subtract -(2^63) than to add 2^63, since the former can itself be represented in a signed int64 for easy conversion to numeric.) -- Andrew (irc:RhodiumToad)
> On Wed, Dec 04, 2019 at 11:49:20AM +0000, Andrew Gierth wrote: > > >>>>> "Dmitry" == Dmitry Dolgov <9erthalion6@gmail.com> writes: > > Dmitry> Hi, > > Dmitry> Probably a simple question, but I don't see a simple answer so > Dmitry> far. In one extension I want to convert uint64 into a numeric > Dmitry> to put it eventually into a jsonb object. As far as I see in > Dmitry> numeric.c there are functions only for signed int64. Is there a > Dmitry> way to achive this with uint64 (without duplicating significant > Dmitry> part of numeric implementation in the extension)? > > Sure. Flip the top bit; convert the value as if signed; then subtract > -(2^63) from the result. (Easier to subtract -(2^63) than to add 2^63, > since the former can itself be represented in a signed int64 for easy > conversion to numeric.) Indeed, looks like this does the trick, thank you!