代码之家  ›  专栏  ›  技术社区  ›  Kris Pruden

Solaris 9上的printf+uint_64?

  •  9
  • Kris Pruden  · 技术社区  · 16 年前

    我有一些c++代码,它使用sprintf将uint_64转换为字符串。这需要可移植到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
    }
    

    我能用什么?

    5 回复  |  直到 16 年前
        1
  •  11
  •   Michael Burr    16 年前

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

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

        2
  •  7
  •   wnoise    16 年前

    在C99兼容系统上:

    #include <inttypes.h>
    
    uint64_t big = ...;
    printf("%" PRIu64 "\n", big);
    

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

    其中PRI表示printf()族,SCN表示scanf()族,d和i表示有符号整数类型;o、 u、x、x表示无符号整数类型,如八进制、十进制、十六进制和十六进制;N是支撑宽度之一;最小和快速对应于这些修饰语;PTR代表intptr\t;MAX代表intmax\t。

        3
  •  2
  •   coppro    16 年前

    unsigned long long 而不是其他类型(这符合当前标准,以及 long long 就C99支持而言,它非常常见),附加 ULL 而不是 L %llu 作为你的说明符。如果不存在对C99的支持,您可能需要检查编译器文档,因为没有其他标准方法可以这样做。 长长的

        4
  •  0
  •   C. K. Young    16 年前

    %llu 很久很久了。然而,这也不是很便于携带,因为 long long

        5
  •  0
  •   T Percival Daniel Gehriger    16 年前

    你可以 uint64_t 从…起 stdint.h