9

我有一些使用 sprintf 将 uint_64 转换为字符串的 c(++) 代码。这需要可移植到 linux 和 Solaris。

在 linux 上我们使用 %ju,但在 Solaris 上似乎没有任何等价物。我能找到的最接近的是 %lu,但这会产生不正确的输出。一些示例代码:

#include <stdio.h>
#include <sys/types.h>

#ifdef SunOS
typedef uint64_t u_int64_t;
#endif

int main(int argc, char **argv) {
    u_int64_t val = 123456789123L;

#ifdef SunOS
    printf("%lu\n", val);
#else
    printf("%ju\n", val);
#endif
}

在linux上,输出如预期;在 Solaris 9 上(不要问),它是“28”

我可以使用什么?

4

5 回答 5

11

如果你有 inttypes.h 可用,你可以使用它提供的宏:

printf(  "%" PRIu64 "\n", val);

不漂亮(我最近似乎经常这么说),但它确实有效。

于 2008-10-03T00:22:30.070 回答
7

在符合 C99 的系统上:

#include <inttypes.h>

uint64_t big = ...;
printf("%" PRIu64 "\n", big);

请参阅 C99 标准的第 7.8 节。

说明符是 {PRI,SCN}[diouxX]{N,LEASTN,MAX,FASTN,PTR}

其中 PRI 用于 printf() 系列,SCN 用于 scanf() 系列,d 和 i 用于有符号整数类型;o,u,x,X 用于八进制、十进制、十六进制和十六进制等无符号整数类型;N 是支持的宽度之一;LEAST 和 FAST 对应于那些修饰符;PTR 用于 intptr_t;MAX 用于 intmax_t。

于 2008-10-03T00:33:05.067 回答
2

答案取决于您的代码实际上是 C 还是 C++。在 C 中,您应该使用一种unsigned long long而不是另一种类型(这符合当前标准,并且long long就 C99 支持而言非常普遍),附加ULL而不是L您的常量,并使用(如前所述)%llu作为您的说明符。如果不存在对 C99 的支持,您可能需要查看编译器文档,因为没有其他标准方法可以做到这一点。long long保证至少为 64 位。

于 2008-10-03T00:23:29.087 回答
0

你可以使用%llu很长时间。但是,这也不是很便携,因为long long不能保证是 64 位。:-)

于 2008-10-03T00:20:26.410 回答
0

如果你想避免 SunOS 条件 typedef,你可以从中得到uint64_tstdint.h

于 2008-10-03T00:22:47.543 回答