Postgresql C如何将uint64\u t转换为数字?

Postgresql C如何将uint64\u t转换为数字?,c,postgresql,uint64,C,Postgresql,Uint64,Postgres不支持uint64_t,最大的整数类型是BIGINT,其范围等于int64。我需要从C函数返回一个unit64\u t var,如何将其转换为数值,然后才能从我的函数返回一个数值?C的uint64\u t和int64\u t可以在两个补码运算中相互转换而不丢失信息,但我怀疑您是否使用UNIVAC,因此,您可以在将所有uint64_t数量写入数据库之前将其强制转换为int64_t,然后在读取时返回uint64_t 不过,还有一些潜在的问题。首先,如果您需要在相关数据库列中存储实际的

Postgres不支持uint64_t,最大的整数类型是BIGINT,其范围等于int64。我需要从C函数返回一个unit64\u t var,如何将其转换为数值,然后才能从我的函数返回一个数值?

C的uint64\u t和int64\u t可以在两个补码运算中相互转换而不丢失信息,但我怀疑您是否使用UNIVAC,因此,您可以在将所有uint64_t数量写入数据库之前将其强制转换为int64_t,然后在读取时返回uint64_t

不过,还有一些潜在的问题。首先,如果您需要在相关数据库列中存储实际的负数,请不要这样做,因为您无法分辨它们是负数还是高于263的数字−1当你读回它们的时候。此外,所有SQL操作将处理所有大于263的数字−1为阴性。这可能是问题,也可能不是问题,这取决于您使用这些大数字的目的以及涉及它们的查询的复杂程度


编辑:我刚刚意识到,您所说的数字可能是指PostgreSQL的任意精度数字列类型。不幸的是,我找不到任何关于如何在文本SQL级别下使用这种类型的文档。我唯一能建议的是,您阅读用C编写服务器端扩展的头文件和/或向pg邮件列表寻求帮助。

我找不到直接处理此转换的现有函数。更糟糕的是,用于构建数值的所有结构和函数似乎都是本地的,并且在附带的文档中没有太多用处,因此我不确定您希望自己如何构建它们,就像我们一样

似乎这基本上将您限制在类型的SQL级别API上,即内置类型强制转换和算术运算。我认为唯一的另一种SQL类型是文本,它既可以转换为数字,又可以容纳uint64。换句话说,最简单的方法可能是将值转换为字符串,并将其传递到数值解析例程,例如:

char uint64_string [21];
sprintf(uint64_string, "%" PRIu64, uint64_val);
PG_RETURN_DATUM(DirectFunctionCall3(numeric_in, CStringGetDatum(uint64_string), 0, -1));

Postgres会存储可能超过63位整数的数字吗?在C语言中,可以从uint64转换为int64,反之亦然。我不明白你的问题。唯一的问题是如果它使用第64位,因为这样数字将变成负数,OP将不得不从stdint.h使用类似于u uint128的东西,而不是uint64