【问题标题】:Printing unsigned long long int Value Type Returns Strange Results打印 unsigned long long int 值类型返回奇怪的结果
【发布时间】:2012-05-26 16:56:04
【问题描述】:

我在使用printf 函数打印unsigned long long int 类型的值时遇到问题

我不知道出了什么问题。我在 Windows 7 Professional 64 位上使用 Dev-Cpp 4.9.9.2 和 Visual Studio 2010 Professional(我知道它不是 C 编译器,但无论如何,想尝试一下)。对于显示,我使用了%llu 修饰符(根据How do you printf an unsigned long long int(the format specifier for unsigned long long int)?),但我也尝试了 I64d,但没有任何效果...


首先,我只想打印unsigned long long int 的最小值和最大值(使用来自limits.hULONG_MAX

printf("unsigned long long int: \n%llu to %llu \n\n", 0, ULONG_MAX);

返回:

unsigned long long int:18446744069414584320 到 1580552164021 (Dev-Cpp)

unsigned long long int: 18446744069414584320 to 0 (Visual Studio)


然后我尝试使用printf 打印两个零

printf("unsigned long long int: \n%llu to %llu \n\n", 0, 0);

返回:

unsigned long long int: 0 到 1580552164021 (Dev-Cpp)

unsigned long long int: 0 到 0 (Visual Studio)


还尝试了两个ULONG_MAX

printf("unsigned long long int: \n%llu to %llu \n\n", ULONG_MAX, ULONG_MAX);

返回:

unsigned long long int:18446744073709551615 到 1580552164021 (Dev-Cpp)

unsigned long long int: 18446744073709551615 到 0 (Visual Studio)


为什么会这样?能给我解释一下吗?

【问题讨论】:

    标签: c syntax printf unsigned-long-long-int


    【解决方案1】:

    long long int 是 C99 标准中的一种类型,MSVC 不支持。使用支持 C99 的编译器(如 MinGW for Windows),它会工作。

    【讨论】:

    • MSVC 确实支持 long long 尽管不完全支持 C99。
    【解决方案2】:

    这是错误的:

    printf("unsigned long long int: \n%llu to %llu \n\n", 0, ULONG_MAX);
    

    您使用了unsigned long long 格式说明符,但您传递了intunsigned long 值。促销规则意味着您可以对 int 尺寸或更小的所有东西都马虎,这不适适用于 long long

    使用演员表:

    printf("unsigned long long int: \n%llu to %llu \n\n",
           0ULL, (unsigned long long) ULONG_MAX);
    

    解释:当将参数传递给printf 时,任何可以适合int 的类型都被提升为int,然后任何可以适合unsigned int 的类型都是晋升为unsigned int。也可以将无符号类型传递给有符号格式说明符,反之亦然,只要传递的 可以使用格式说明符指定的类型来表示。

    所以你必须小心longlong long,但你可以马虎intshortchar

    大多数编译器都有设置让它们警告你这种类型的错误,因为它可以在编译时很容易地检测到; GCC 和 Clang 有 -Wformat 导致以下警告:

    test.c:5:警告:格式“%llu”需要类型“long long unsigned int”,但参数 2 的类型为“int” test.c:5:警告:格式“%llu”需要类型“long long unsigned int”,但参数 3 的类型为“long unsigned int”

    【讨论】:

      【解决方案3】:

      ULONG_MAX 指的是unsigned long 而不是unsigned long long。对于后者,使用ULLONG_MAX(注意额外的L)。

      您需要像这样更改printf() 调用:

      printf("unsigned long long int: \n%llu to %llu \n\n", 0ULL, ULLONG_MAX);
      printf("unsigned long long int: \n%llu to %llu \n\n", ULLONG_MAX, ULLONG_MAX);
      

      这可确保printf() 的参数与格式说明符匹配。

      【讨论】:

        【解决方案4】:

        你没有通过unsigned long longs。您正在传递 int (0) 和 unsigned long (ULONG_MAX)。您必须准确地将您承诺在格式字符串中传递的内容传递给printf()

        试试这个:

        printf("unsigned long long int: \n%llu to %llu \n\n", 0ULL, (unsigned long long)ULONG_MAX);
        

        【讨论】:

          猜你喜欢
          • 2016-06-28
          • 2011-08-25
          • 2016-07-29
          • 1970-01-01
          • 1970-01-01
          • 2012-01-27
          • 2013-10-17
          • 2014-08-10
          • 2021-05-19
          相关资源
          最近更新 更多