On 06/11/2015 09:36, Pierre Morel wrote: > The calculation are not broken and it works for actual usage
Thanks for confirming. > For me, it is the design that is broken, as it uses an integer to represent > something that is fundamentally unsigned like the size of a memory area. But it uses a very large integer. :) Consider that every time you do math on uint16_t, C is actually using a 32-bit signed integer. This is roughly the same. > This leads to have UINT64_MAX represented with {1, 0} instead of {0, > UINT64_MAX} > while {1, 0} is 2^64. > This again leads to have unnecessary and obfuscating transformations > with int128_2_64() > to test for UINT64_MAX and return {1,0} in memory_region_init() while using > inverse translation test{1,0} and return UINT64_MAX in memory_region_size() Yes, the use of UINT64_MAX for 2^64 is a hack, but it is unrelated to the signedness of Int128. Paolo