Re: Canonical way / best practice for 128-bit integers
- In reply to: Marc Veldman : "Canonical way / best practice for 128-bit integers"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 09 Jul 2022 16:56:05 UTC
On 7/9/22 11:26, Marc Veldman wrote:
> Hello,
>
> I’m working on some bluetooth code, and that involves handling 128-bit uuids.
> There are various ways to handle in the FreeBSD codebase, like in sdp.h:
>
> /*
> * SDP int128/uint128 parameter
> */
>
> struct int128 {
> int8_t b[16];
> };
> typedef struct int128 int128_t;
> typedef struct int128 uint128_t;
>
> and in sys/dev/random/uint128.h
>
> #ifdef USE_REAL_UINT128_T
> typedef __uint128_t uint128_t;
> #define UINT128_ZERO 0ULL
> #else
> typedef struct {
> /* Ignore endianness */
> uint64_t u128t_word0;
> uint64_t u128t_word1;
> } uint128_t;
> static const uint128_t very_long_zero = {0UL,0UL};
> #define UINT128_ZERO very_long_zero
> #endif
>
> Is there any recommended / standard way to handle 128 bit integers in a portable way?
>
> Best regards,
>
> Marc Veldman
Have you tried working with __uint128_t? Support is not complete, e.g.
in inttypes.h and printf(), but arithmetic works:
NetBSD netbsd9.acadix bacon ~ 1002: (pkgsrc): cat junk.c
#include <stdio.h>
#include <sysexits.h>
int main(int argc,char *argv[])
{
__uint128_t x = 20, y = 30;
printf("%zu %lu\n", sizeof(x), (unsigned long)(x + y));
return EX_OK;
}
NetBSD netbsd9.acadix bacon ~ 1003: (pkgsrc): ./junk
16 50
--
Life is a game. Play hard. Play fair. Have fun.